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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Synaric 中级黑马   /  2015-10-3 14:27  /  431 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Condition,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set (wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
  1. public class ThreadTest {
  2.         public static void main(String[] args) {
  3.                 final Business business = new Business();
  4.                 new Thread(new Runnable() {
  5.                         @Override
  6.                         public void run() {
  7.                                 threadExecute(business, "sub");
  8.                         }
  9.                 }).start();
  10.                 threadExecute(business, "main");
  11.         }       
  12.         public static void threadExecute(Business business, String threadType) {
  13.                 for(int i = 0; i < 100; i++) {
  14.                         try {
  15.                                 if("main".equals(threadType)) {
  16.                                         business.main(i);
  17.                                 } else {
  18.                                         business.sub(i);
  19.                                 }
  20.                         } catch (InterruptedException e) {
  21.                                 e.printStackTrace();
  22.                         }
  23.                 }
  24.         }
  25. }
  26. class Business {
  27.         private boolean bool = true;
  28.         private Lock lock = new ReentrantLock();
  29.         private Condition condition = lock.newCondition();
  30.         public /*synchronized*/ void main(int loop) throws InterruptedException {
  31.                 lock.lock();
  32.                 try {
  33.                         while(bool) {                               
  34.                                 condition.await();//this.wait();
  35.                         }
  36.                         for(int i = 0; i < 100; i++) {
  37.                                 System.out.println("main thread seq of " + i + ", loop of " + loop);
  38.                         }
  39.                         bool = true;
  40.                         condition.signal();//this.notify();
  41.                 } finally {
  42.                         lock.unlock();
  43.                 }
  44.         }       
  45.         public /*synchronized*/ void sub(int loop) throws InterruptedException {
  46.                 lock.lock();
  47.                 try {
  48.                         while(!bool) {
  49.                                 condition.await();//this.wait();
  50.                         }
  51.                         for(int i = 0; i < 10; i++) {
  52.                                 System.out.println("sub thread seq of " + i + ", loop of " + loop);
  53.                         }
  54.                         bool = false;
  55.                         condition.signal();//this.notify();
  56.                 } finally {
  57.                         lock.unlock();
  58.                 }
  59.         }
  60. }
复制代码

Condition是被绑定到Lock上的,要创建一个Lock的Condition必须用newCondition()方法。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马