java挂起、恢复和终止线程&线程间通信


有时,线程的挂起是很有用的。例如,一个独立的线程可以用来显示当日的时间。如果用户不希望用时钟,线程被挂起。先于java2的版本,程序用Thread定义的suspend()和resume()来暂停和再启动线程。
    java2中挂起、恢复和终止线程。thread定义的suspend(),resume()和stop()方法看起来是管理线程的完美的和方便的方法,它们不能用于新java版本的程序。thread()方法有时会造成严重的系统故障。假定对关键的数据结构的一个线程被锁定的情况,如果该线程在哪里挂起,这些锁定的线程并没有放弃对资源的控制。其他的等待这些资源的线程可能死锁。    而resume不能离开suspend()方法而独立使用。   同样stop()方法可能导致严重的系统故障。设想一个线程正在写一个精密的重要的数据结构仅能完成一个零头。如果该线程在此终止,则数据结构可能会停留在崩溃状态。
    在java2中线程必须被设计以使run()方法定期检查以来判定线程是否应该被挂起,恢复或终止它自己的执行。有代表性的,这由建立一个指示线程状态的标志变量来完成。只要该标志设为“running”,run()方法必须继续让线程执行。如果标志为“suspend”,线程必须暂停。若为“stop”,线程必须终止。编写这样的代码有很多方法,单中心主题对多有的程序应该是相同的。


       线程间通信:多线程通过把任务分成离散的合乎逻辑的单元代替了事件循环程序。线程还有第二优点:它远离轮询。轮询通常由重复检测条件的循环实现。一旦条件成立,就要采取适当的行动。这浪费了CPU时间。举例来说,当一个线程正在产生数据而另一个程序正在消费它。假设数据产生器必须等待消费者完成工作才能产生新的数据。在轮询系统,消费者在等待生产者产生数据时会浪费很多CPU周期。一旦生产者完成工作,它将启动轮询,浪费更多的CPU时间等待消费者的工作结束,如此下去。
    为避免轮询,java包含了通过wait(),notify()和notifyAll()方法实现的一个进程间通信机制。这些方法在对象中是用final方法实现的,所以所有的类都含有它们。这三个方法仅在synchronized方法中才能被调用。尽管这些方法从计算机科学远景方向上来说具有概念的高度先进性,实际很简单:
 【】wait()告知被调用的线程放弃管程进入睡眠直到其他线程进入相同管程并且调用notify()。
 【】notify()恢复相同对象中第一个调用wait()的线程。
 【】notifyAll()恢复相同对象中所有调用wait()的线程。具有高优先级的线程最先运行。
    这些方法在Object中被声明如下:
 final void wait() throws InterruptedException
 final void notify()
 final void notifyAll()

转自:http://hi.baidu.com/may_62/item/9d58778e5d3f80de5f0ec127

你可能感兴趣的:(java挂起、恢复和终止线程&线程间通信)