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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑色救护车 于 2015-4-28 11:33 编辑

大家看下面这个线程唤醒的代码。
  1. package com.heisejiuhuche.exception;

  2. public class InterruptedExceptionTest {
  3.         public static void main(String[] args) {
  4.                 int x = 0;
  5.                 Test t = new Test();
  6.                 Thread t1 = new Thread(t);
  7.                 Thread t2 = new Thread(t);
  8.                 t1.start();
  9.                 t2.start();
  10.                
  11.                 while(true) {
  12.                         if(x == 60) {
  13.                                 t1.interrupt();
  14.                                 t2.interrupt();
  15.                                 break;
  16.                         }
  17. //                        System.out.println(Thread.currentThread().getName() + x);
  18.                         x ++;
  19.                 }
  20.                 System.out.println("Main Over...");
  21.         }
  22. }


  23. class Test implements Runnable {
  24.         private boolean flag = true;
  25.         @Override
  26.         public synchronized void run() {
  27.                 while(flag) {
  28.                         try {
  29.                                 System.out.println(Thread.currentThread().getName() + " wait...");
  30.                                 wait();
  31.                         } catch(InterruptedException e) {
  32.                                 System.out.println(Thread.currentThread().getName() + "Interrupted....");
  33.                                 flag = false;
  34.                         }
  35.                         System.out.println(Thread.currentThread().getName() + " running");
  36.                 }
  37.         }
  38. }
复制代码
奇怪的问题是这样,代码中注释的那一行代码,注释掉之后,打印结果如下:
  1. Main Over...
  2. Thread-0 wait...
  3. Thread-0Interrupted....
  4. Thread-0 running
复制代码
只有1个线程进行了等待,而且是等主线程执行完之后,才执行了等待的代码。。。然后再被唤醒;而另一个线程根本没有执行等待和唤醒。。。
如果将注释的代码加上,打印结果如下:
  1. main0
  2. Thread-0 wait...
  3. Thread-1 wait...
  4. main1
  5. main2
  6. main3
  7. main4
  8. main5
  9. main6
  10. main7
  11. main8
  12. main9
  13. Main Over...
  14. Thread-0Interrupted....
  15. Thread-0 running
  16. Thread-1Interrupted....
  17. Thread-1 running
复制代码

线程等待在主线程执行时也交替执行了,并且两个线程都执行,并被唤醒。。。这个情况。。。真的是搞不懂。。。大家看看是怎么回事呢。。。



评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

1 个回复

倒序浏览
木有人回答。。。。我顶~  大家帮我看看啊!:'(
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马