黑马程序员技术交流社区

标题: 关于JDK1.5中Executors多线程问题 [打印本页]

作者: 会飞的蜗牛    时间: 2014-10-7 22:42
标题: 关于JDK1.5中Executors多线程问题
  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





作者: 会飞的蜗牛    时间: 2014-10-8 20:36
为什么没人呢
作者: 会飞的蜗牛    时间: 2014-10-11 21:33
Thanks,我是来刷技术分的·····以前遇到的问题直接粘过来了。嘿嘿。不过还是谢谢了。
问题中开始没明白,这样的多线程中本身停在哪被唤醒之后就还是在原来的语句后继续执行。还有一个问题是
其实虽然是用的同一个condition,但是condition.signal唤醒的是等待中的线程。

作者: 会飞的蜗牛    时间: 2014-10-14 07:29
我啊啊啊啊啊啊啊3




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