A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lksirt 中级黑马   /  2016-5-12 21:33  /  741 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

线程间的通信
线程间的通信(即为等待/唤醒机制)
举例说明:
    常见的生产者与消费者的问题
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就会具备运行资格,继续运行。加入线程,可以完成对某个线程的临时加入执行。

2 个回复

倒序浏览
不错,学习了学习了
回复 使用道具 举报
善于总结,赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马