黑马程序员技术交流社区

标题: 线程间的通信 总结 [打印本页]

作者: lksirt    时间: 2016-5-12 21:33
标题: 线程间的通信 总结
线程间的通信
线程间的通信(即为等待/唤醒机制)
举例说明:
    常见的生产者与消费者的问题
1、当多个生产者消费者出现时,需要让获取执行权的线程判断标记(通过while完成)。
2、需要将对方的线程唤醒时,JDK1.5版本之前 使用notifyAll(),来实现唤醒所有线程,在JDK1.5版本及以后提供了一些新的对象,优化了等待/唤醒机制。

将synchronized替换成了Lock接口(将隐式锁升级成了显示锁。)
将Object类中的wait();notify();notifyall();替换成了Condition的await();signal();signalall();
  Lock类   方法:   获取锁   lock();
                               释放锁   unlock();注意:释放锁一定要执行,所以通常会定义在finally中
                   获取Condition对象   newCondition();

示例:
  Lock lock=new ReentrantLock();
  Condition conA=lock.newCondition();
  Condition conB=lock.newCondition();
  con.await(); //生产   消费
  con.signal();
  set()
{
    If(flag)
           conA.await();
    code…….;
    flag=true;
        conB.signal();
}
Out()
{
    If(!flag)
            conB.await();
    code…….;
    flag=false;
         conA.signal();
}
wait和sleep的区别
wait   释放cpu执行权,释放同步中的锁
sleep  释放cpu执行权,不释放同步中的锁
停止线程:
     Stop();过时了
     停止线程的原理:run方法结束。
            run();中通常定义循环,指定循环结束即可
1、定义flag结束
2、当线程处于了冻结状态,没有执行标记时,程序就无法运行了
这时可以循环正常退出冻结状态  或者  强行退出冻结状态
使用  interrupt(); 可使线程强制退出冻结状态,但会发生异常
线程中的一些常用方法:
     setDaemon(boolean): 将线程标记为后台线程,后台线程和前台线程一样开启,一样抢cpu执行权;只有结束时有区别,当前台线程都运行结束后,后台线程会自动结束
     join():    等待该线程结束。当A线程执行到了B的.join方法时,A就会处于冻结状态。A什么时候运行呢?当B运行结束后,A就会具备运行资格,继续运行。加入线程,可以完成对某个线程的临时加入执行。


作者: Sj改变    时间: 2016-5-13 10:00
不错,学习了学习了
作者: cxl1694095035    时间: 2016-5-13 10:05
善于总结,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2