标签:style io 使用 java on 数据 代码 ad new
当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行。
实现这种功能可以借助于Object类提供的wait()、notify()、notifyAll()三个方法(注意,这三个方法属于Object类,不属于Thread类)。这三个方法必须由同步监视器来调用,可以分为两种情况:
介绍下这三个方法:
wait():导致当前线程等待(由运行进入阻塞),直到其他线程调用该同步监视器的notify()或notifyAll()方法来唤醒该线程。wait()方法会使当前线程释放对同步监视器的锁定;
notify():唤醒(由阻塞进入就绪)在同步监视器上等待的一个线程。如果多个线程都此同步监视器上等待,则会任意唤醒其中一个线程。被唤醒的线程不能立即执行,需要当前线程释放对同步监视器的锁定后才可以;
notifyAll:唤醒在同步监视器上等待的所有线程。同样被唤醒的线程不能立即执行,需要当前线程释放对同步监视器的锁定后才可以获得执行的机会。
当线程使用同步锁来实现线程同步时,系统中不存在隐式的同步监视对象,也就不能使用wait()、notify()、notifyAll()来协调线程。
当使用Lock对象保证线程同步时,Java提供了Condition类来协调线程通信。Condition实例实质上被绑定在Lock对象上,要获得特定Lock的Condition实例,使用该对象的newCondition()方法即可。
Condition提供了await()、signal()、signalAll()来实现线程协调。这三个方法分别对应同步监视器对象的wait()、notify()、notifyAll()方法,只不过调用者不同罢了。
管道流分为三大类:管道字节流(PipedInputStream和PipedOutputStream)、管道字符流(PipedReader和PipedWriter)和新IO管道(Pipe.SinkChannel和Pipe.SourceChannel)。
使用管道流进行线程通信可按如下步骤进行:
尽量少使用管道流进行通信,最好的方式还是使用线程共享数据进行通信。
标签:style io 使用 java on 数据 代码 ad new
原文地址:http://www.cnblogs.com/amunote/p/4136158.html