线程通信

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)两个线程可以分别依赖各自的管道输入流、输出流进行通信

posted @ 2013-09-18 16:41  liutoutou  阅读(209)  评论(0编辑  收藏  举报