多线程总结2(死锁等问题)

来源:互联网 发布:ubuntu wine qq2014 编辑:程序博客网 时间:2024/05/29 18:37

线程间通讯:
其实就是多个线程操作同一个资源
但是操作动作不同


处理安全问题:
1,同步处理
2,使用同一个锁
 
(视频3)等待唤醒机制:
wait()等待,notify()唤醒,等都必须在同步中(锁)进行。
因为要对持有监视器(锁)的线程操作,所以要使用在同步中,因为只有同步才具有锁

为什么这些操作线程的方法要定义Object类中呢?
因为这些方法在操作同步中线程时,都必须要表示他们所才做线程的只有锁,
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒,
不可以被不同锁中的线程进行唤醒。

也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以可以被任意对象调用的方法定义Object类中

(视频4)当出现2个以上线程时,则用IF判断无法满足,必须要用while判断,并且用nodifyAll()来唤醒其他线程。当苏醒时如果用if则直接往下执行,如果用while 则需要返回在判断一次。如果使用while 判断时只单单使用nodify()唤醒最早被wait()的线程时,如果是本类线程则会导致全部挂起状态。


JDK1.5中提供了多线程升级解决方案,
将同步Synchronized替换成现实 Lock操作。
将Object中的wait,notify notifyAll,替换成了Condition对象。
该对象可以Lock锁,进行获取。
该实例中,实现了本方唤醒对方操作。

stop方法已经过时。
如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。

当没有指定的方式让冻结的线程回复到运行状态时,这时需要对冻结进行清除。
强制让线程回复到运行状态中来

join:
当A线程执行到了B线程的.join()方法时,A就会等待,等到B线程都执行完,A才会执行。
join可以用来临时加入线程执行

原创粉丝点击