1、线程的协调运行
Object类提供wait()、notify()和notifyAll()三个方法,不属于Thread类,这三个方法必须由同步监视器对象来调用 在同步方法和同步方法块中使用
wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()或notifyAll()方法来唤醒改线程,调用wait()方法的当前线程会释放对该同步监视器的锁定
notify():唤醒在此同步监视器上等待的单个线程。如果有多个,任意选取其中一个,只有当前线程放弃对该同步监视器的锁定后(使用wait()方法),才可以执行被唤醒的线程
notifyAll():唤醒在此同步监视器上等待的所有线程。
2、使用条件变量控制协调
如果不使用synchronized来保证同步,而是直接使用Lock来保证同步,则系统中不存在同步监视器对象,不能使用上述三个方法
当使用Lock对象保证同步时,用Condition来保持协调,其可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待的线程
要获得Lock实例的Condition实例,调用Lock对象newCondition() 方法即可
await():导致当前线程等待,直到其他线程调用该Condition的signal()或signalAll()方法来唤醒改线程,
signal():唤醒在此Lock对象上等待的单个线程。如果有多个,任意选取其中一个,只有当前线程放弃对该Lock对象的锁定后(使用await()方法),才可以执行被唤醒的线程
signalAll():唤醒在此Lock对象上等待的所有线程
3、使用管道流
PipedInputStream和PipedOutputStream 管道字节流
PipedReader和PipedWriter 管道字符流
Piped.SinkChannel和Piped.SourceChannel 新IO的管道Channel
步骤:
1)使用new操作符分别创建管道输入流和输出流
2)使用管道输入流或输出流的connect方法把两个输入流和输出流连接起来
3)将管道输入流输出流分别传入两个线程
4)两个线程可以分别依赖各自的管道输入流、输出流进行通信