本笔记大部分内容来自慕课网的视频:深入浅出Java多线程:http://www.imooc.com/learn/202
1.Java多线程在日常编程中使用的非常多,因此,对于一些常见的知识有必要做一些笔记。这里主要介绍运用在多线程中的一些基本方法。
(1)位于java.lang.Thread中的yield()方法。
作用:使当前调用该方法的线程让出CPU资源,使得所有线程重新竞争获得CPU资源。
(2)位于java.lang.Thread中的join()方法。
作用:使当前调用该方法的线程独占CPU资源,直到该线程终止。
2.在Java一个不断运行的线程中,需要停止这个线程的方法有很多种,常见的几种正确和错误的方法:
错误的方法:(1)使用java.lang.Thread.stop()方法。
这个方法已被Java标记为 @Deprecated,表示这个方法并不安全。
错误的方法:(2)使用java.lang.Thread.interrupt()方法。
调用Object类的wait()方法,或者该类的 join()或sleep() 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
正确停止线程的方法:(3)设置标志位flag,可保证线程内一次任务的完整执行。
3.同步与互斥
(1)通过synchronized关键字来给指定对象加锁,保证同一时间只能有一个线程获得该对象的锁,即保证了synchronized内部的代码在一个时刻只能有一个线程进行操作。
代码:
synchronized(obj)
{
// 此处添加同步代码
}
(2)通过java.lang.Object的wait()方法,可以将当前线程放入Wait Set中,以免当前线程继续争用锁对象,消耗CPU资源。
对象调用wait()方法后,首先释放锁,然后当前线程进入Wait Set中。其他线程调用notify()方法后,将唤醒Wait Set中的某一条线程,或调用notifyAll()方法,将唤醒Wait Set中所有线程,使它们有机会重新争用CPU资源。
代码:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate tocondition
}
(3)通过java.lang.Object的notify()或notifyAll()方法,可以唤醒在Wait Set中的线程,使得他们有机会重新争用锁对象。注意:notify()方法只能唤醒Wait Set中的一条线程,但并不能决定是哪条线程;而notifyAll()是唤醒Wait Set中的所有线程。
代码:
synchronized (obj) {
... // Perform action appropriate tocondition
... // TODO Your job
notify();
}
(4)wait()方法和notify()方法或notifyAll()的典型使用代码如下:
代码:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate tocondition
... // TODO Your job
notify();
}
示意图:
4.线程的五种状态
(1)新建状态(NEW)
使用new线程后的状态。
(2)就绪状态(RUNNABLE)
线程在争用锁之前的状态或者被notify()或notifyAll()方法唤醒的状态,或者是sleep()过后的状态,或者是调用Thread.start()方法后的状态。
(3)运行状态(RUNNING)
线程在CPU中运行的状态,即调用Thread.run()方法后的状态。
(4)阻塞状态(BLOCKED)
当方法调用了sleep(),wait()方法时,将使线程进入阻塞状态。
(5)死亡状态(DEAD)
线程运行完或者是未捕获异常终止了run()方法。
五种状态转换示意图:
5.想要更深入了解Java多线程并发编程,可学习以下知识:
(1)JMM : JAVA Memory Model
JMM描述了Java线程如何通过内存进行交互,了解happens-before原则,以及happens-before原则的关键字:synchronized , volatile & final
(2)Locks & Condition 类
java.util.concurrent.locks 中的Locks 和 Condition接口
这两个接口说明了Java锁机制和等待条件的高层实现。
(3)线程安全性
线程安全性包括原子性和可见性,了解java.util.concurrent.atomic下的类的操作,了解synchronized 和 volatile 关键字,以及死锁(Deadlocks)
(4)多线程编程常用的交互模型
常见的多线程交互模型包括Producer-Consumer(生产者-消费者)模型、Read-Write Lock 模型、Future 模型、Worker Thread 模型
(5)Java中并发编程工具
包括java.util.concurrent下的所有类,线程池,java.util.concurrent.ExecutorService,java.util.concurrent.Callable & java.util.concurrent.Future,java.util.concurrent.BlockingQueue
(6)推荐两本书
CORE Java : Volume I – Fundamental
JAVA Concurrency in Practice