Java多线程机制
进程与线程
- 线程之间可以共享内存
- 用来实现数据交换、实时通信与必要的同步操作
- 与进程的不同:现成的中断与恢复可以更加节省系统的开销
-
线程的状态与生命周期
- 新建状态
- 可运行状态
- 中断状态
- 死亡状态
-
线程的调度与优先级
- 优先级可以通过
setPriority(int grade)
方法来更改
- 优先级可以通过
Thread类与线程的创建
- 使用Thread的子类 (例12-1)
- 优点:
- 可以在子类中增加新的成员变量(新属性)
- 可以增加新的成员方法(新功能)
- 缺点
- Java不支持多继承,无法拓展其他类
- 优点:
- 使用Thread类,通过接口实现 (例12-2)
- 通常使用的构造方法:
Thread(Runnable target)
- 对于使用同一目标对象的线程,目标对象的成员变量就是这些线程共享的数据单元 (例12-3)
- 通常使用的构造方法:
线程的常用方法
start()
run()
:与Runnable接口中run()
方法相同sleep(int millsecond)
:static方法,如果线程在休眠时候被打断,就会抛出InterruptedException
异常,必须在try-catch语句中使用sleep方法isAlive()
currentThread()
:返回正在使用cpu资源的线程interrupt()
:用来吵醒休眠的线程,重新进入Runnable状态
线程同步
- 若干个线程都需要使用
synchronized
修饰的方法或代码块 - 多线程调用
synchronized
方法必须遵守同步机制(即排队使用)(例12-7)
协调同步的线程
wait()
方法- 中断线程的执行,暂时让出cpu的使用权等待通知后,才参与CPU资源抢夺
yield()
方法- 将CPU资源让出,但立刻加入CPU资源的争抢
notifyAll()
方法- 通知所有由于使用同步方法而处于等待状态的方法结束等待,进入就绪状态
notify()
方法- 通知指定的使用同步方法而处于等待状态的方法结束等待, 进入就绪状态
- 注:不可以在非同步方法中使用以上三个方法
线程联合
- 一个线程A在占有cpu资源期间可以让其他线程调用
join()
与本线程联合 - 联合后A将立即中断执行,直到B线程执行完毕,A再重新排队等待cpu资源
[[GUI]]线程
- 两个重要线程:
AWT-EventQuecue
- 负责处理GUI事件
AWT-Windows
- 负责将窗体或组件绘制到桌面
守护线程
- 守护线程:当程序中的所有用户线程都已经结束运行时,守护线程立刻结束运行(无视
run()
方法) - 常见的守护线程:垃圾回收机制
- 注:一个线程必须在运行之前设置自己是否为守护线程
- 声明方式:
ThreadName.setDaemon(true)