1、多线程
1.1 线程与进程
· 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序基本单位;系统运行一个程序即是一个进程从创建,运行到消亡的过程。
· 线程:线程是进程中的一个执行单元,负责当前进程中的执行,一个进程中至少有一个线程。一个进程中是可以多个线程的,这个应用程序也可以称之为多线程程序。
1.2创建线程类
Java 使用 Thread 类代表 线程 ,所有的线程对象都必须是Thread类或其子类的实列。每个线程的作用是完成一定的任务,实际就是执行一段程序流即一段顺序执行的代码
1、定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表线程需要完成的任务,因此把run()方法称为线程执行体。
2、创建Thread子类的实例,即创建了线程对象
3、调用线程对象的start()方法来启动该线程
2、多线程详解
2.1 Thread类
构造方法:
· public Thread() : 分配一个新的线程对象
· public Thread( String name) : 分配一个指定名字的新的线程对象。
· public Thread( Runnable target) : 分配一个带有指定目标的新线程对象。
· public Thread( Runnable target,String name) : 分配一个带有指定目标的新线程对象并指定名字。
常用方法:
· public String getName() : 获取当前线程名称。
· public void start() : 导致此线程开始执行;Java虚拟机调用此线程的run方法。
· public void run() : 此线程要执行的任务在此处定义代码。
· public static void sleep(long millis) : 使用当前正在执行的线程以指定的毫秒数暂停。
· public static Thread currentThread() : 返回对当前正在执行的线程对象的引用
测试类:
自定义线程类:
运行:
2.2 Runnable类
Runnable 也是非常常见的一种,我们只需要重写run方法即可。
1、定义Runnable 接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程执行体。
2、创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Theater对象才是真正的线程对象。
3、调用线程对象的start()方法来启动线程。
代码如下:
3、线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的
而且其他的变量的值也和预期的是一样的,就是线程安全的。
实体类:
测试类:
运行结果:
1、同样的票数,比如98这张票被卖了两次
2、不存在的票,比如0票-1票,是不存在的
这个问题,几个窗口(线程)票数不同步了,这种问题称为线程安全性问题。
4、线性安全问题解决方法
-- synchronized 锁
· 同步代码块:synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问
对于非static方法,同步锁就是this
对于static方法,我们使用当前方法所在类的字节码对象(类名.Class)
格式:
-- Lock锁
Lock机制提供了比 synchronized 代码块和 synchronized 代码块和 synchronized 方法更广泛的锁定操作,同步代码/同步方法具有的功能
·public void lock() : 加同步锁
·public void unlock() : 释放同步锁
标签:run,Thread,对象,线程,方法,public From: https://www.cnblogs.com/PHOEDE/p/17629729.html