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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _Water 中级黑马   /  2014-4-6 16:54  /  1658 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*

  2. 1,线程间通信。
  3.         等待/唤醒机制。

  4.         也就是常见的生产者消费者问题。

  5.         1.当多个生产者消费者出现时,
  6.         需要让获取执行权的线程判断标记。
  7.         通过while完成。

  8.         2.需要将对方的线程唤醒。
  9.         仅仅用notify,是不可以的。因为有可能出现只唤醒本方。
  10.         有可能会导致,所有线程都等待。
  11.         所以可以通过notifyAll的形式来完成 。



  12. 这个程序有一个bug。就是每次notifyAll。都会唤醒本方。
  13. 可不可以只唤醒对方呢?

  14. JDK1.5版本提供了一些新的对象,优化了等待唤醒机制。

  15. 1,将synchronized 替换成了Lock接口。
  16.         将隐式锁,升级成了显示锁。
  17.         Lock
  18.                 获取锁:lock();
  19.                 释放锁:unlock();注意:释放的动作一定要执行,所以通常定义在finally中。
  20.                 获取Condition对象:newCondition();
  21. 2,将Object中的wait,notify,notifyAll方法都替换成了Condition的await,signal,signalAll。
  22.         和以前不同是:一个同步代码块具备一个锁,该所以具备自己的独立wait和notify方法。
  23.         现在是将wait,notify等方法,封装进一个特有的对象Condition,而一个Lock锁上可以有多个Condition对象。


  24.         Lock lock = new ReentrantLock();

  25.         Condition conA = lock.newCondition();
  26.         Condition conB = lock.newCondition();

  27.         con.await();//生产,,消费



  28.         con.signal();生产


  29.         set()
  30.         {
  31.                 if(flag)
  32.                         conA.await();//生产者,
  33.                 code......;

  34.                 flag = true;
  35.                 conB.signal();
  36.         }
  37.        
  38.         out()
  39.         {
  40.                 if(!flag)
  41.                         conB.await();//消费者

  42.                 code....;
  43.                 flag = false;
  44.                 conA.signal();
  45.         }



  46. wait和sleep的区别:
  47. wait:释放cpu执行权,释放同步中锁。
  48. sleep:释放cpu执行权,不释放同步中锁。


  49. synchronized(锁)
  50. {
  51.         wait();
  52. }


  53. 停止线程:
  54.         stop过时。
  55.         原理:run方法结束。run方法中通常定义循环,指定控制住循环线程即可结束。

  56.         1,定义结束标记。
  57.         2,当线程处于了冻结状态,没有执行标记,程序一样无法结束。
  58.                 这时可以循环,正常退出冻结状态,或者强制结束冻结状态。
  59.                 强制结束冻结状态:interrupt();目的是线程强制从冻结状态恢复到运行状态。
  60.                 但是会发生InterruptedException异常。



  61. 线程中一些常见方法:
  62.         setDaemon(boolean):将线程标记为后台线程,后台线程和前台线程一样,开启,一样抢执行权运行,
  63.         只有在结束时,有区别,当前台线程都运行结束后,后台线程会自动结束。

  64.         join():什么意思?等待该线程结束。当A线程执行到了B的.join方法时,A就会处于冻结状态。
  65.                         A什么时候运行呢?当B运行结束后,A就会具备运行资格,继续运行。

  66.         加入线程,可以完成对某个线程的临时加入执行。

  67.        


  68. 多线程重点:
  69. 1,多线程的创建的两种方式,以及区别。

  70. 2,
  71.         同步的特点。
  72.         同步的好处:
  73.         同步的弊端:
  74.         同步的前提:
  75.         同步的表现形式以及区别。
  76.         特例:static同步函数锁是哪一个。

  77.         死锁代码要求写的出来。


  78. 3,线程间通信,看以上总结。


  79. 4,wait和sleep,  yield:临时暂停,可以让线程是释放执行权。

  80. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

3 个回复

倒序浏览
创建线程是Thread方法好,还是继承Runnable接口好?
回复 使用道具 举报
zixindejie 发表于 2014-4-7 15:29
创建线程是Thread方法好,还是继承Runnable接口好?

你描述的有点乱,你想说创建线程是继承Thread的方式好,还是实现Runnable的方式好吧?建议使用实现的方式。
创建线程继承Thread类,和实现Runnable都是可以的,实现方式的好处是:避免单继承的局限性。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马