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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 会飞的蜗牛 中级黑马   /  2014-10-7 22:42  /  1171 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package inter;

  2. import java.util.concurrent.Executors;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6. import java.util.concurrent.locks.Condition;

  7. public class ThreadTest3 {
  8.         private static Lock lock = new ReentrantLock();
  9.         private static Condition subThreadCondition = lock.newCondition();
  10.         private static boolean bBhouldSubThread = false;

  11.         public static void main(String[] args) {
  12.                 ExecutorService threadPool = Executors.newFixedThreadPool(2);
  13.                 threadPool.execute(new Runnable() {
  14.                         public void run() {
  15.                                 for (int i = 0; i < 5; i++) {
  16.                                         lock.lock();
  17.                                         try {
  18.                                                 if (!bBhouldSubThread){//不应该应该执行子线程
  19.                                                         subThreadCondition.await();
  20.                                                         System.out.println("我开始执行了"+bBhouldSubThread);
  21.                                                 }
  22.                                                 for (int j = 0; j < 2; j++) {
  23.                                                         System.out.println("我开始执行了2");
  24.                                                         System.out.println(Thread.currentThread().getName()
  25.                                                                         + ",j=" + j);
  26.                                                 }
  27.                                                 bBhouldSubThread = false;
  28.                                                 subThreadCondition.signal();
  29.                                         } catch (Exception e) {
  30.                                         } finally {
  31.                                                 lock.unlock();
  32.                                         }
  33.                                 }
  34.                         }

  35.                 });
  36.                 threadPool.shutdown();//在完成已提交的任务后关闭服务,不再接受新任务
  37.                 for (int i = 0; i < 5; i++) {
  38.                         System.out.println("我啊啊啊啊啊啊啊");
  39.                         lock.lock();
  40.                         try {
  41.                                 if (bBhouldSubThread){//应该执行子线程
  42.                                         System.out.println("我啊啊啊啊啊啊啊3"+bBhouldSubThread);
  43.                                         subThreadCondition.await();
  44.                                 }
  45.                                 for (int j = 0; j < 10; j++) {
  46.                                         System.out.println(Thread.currentThread().getName() + ",i="
  47.                                                         + j);
  48.                                 }
  49.                                 bBhouldSubThread = true;
  50.                                 subThreadCondition.signal();
  51.                         } catch (Exception e) {
  52.                         } finally {
  53.                                 System.out.println("我啊啊啊啊啊啊啊2");
  54.                                 lock.unlock();
  55.                         }
  56.                 }
  57.         }
  58. }
复制代码
这是主线程和子线程轮番打印数字的程序,我想问一下,是不是subThreadCondition.await();这句之后停在哪儿,然后调用subThreadCondition.signal();之后就在subThreadCondition.await();这句之后继续执行。例如停在了红色的这一句System.out.println("我啊啊啊啊啊啊啊3"+bBhouldSubThread);,那么执行了signal之后会继续执行下面的for循环?还有个问题,只有一个condition,        subThreadCondition.await();这句被调用后,那么到底谁等待啊,这个是怎么控制的,可以说下原理吗?谢谢更多
0




评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

3 个回复

倒序浏览
为什么没人呢
回复 使用道具 举报
Thanks,我是来刷技术分的·····以前遇到的问题直接粘过来了。嘿嘿。不过还是谢谢了。
问题中开始没明白,这样的多线程中本身停在哪被唤醒之后就还是在原来的语句后继续执行。还有一个问题是
其实虽然是用的同一个condition,但是condition.signal唤醒的是等待中的线程。
回复 使用道具 举报
我啊啊啊啊啊啊啊3
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马