黑马程序员技术交流社区

标题: 对线程的疑问 [打印本页]

作者: pphdsny3    时间: 2012-12-19 11:14
标题: 对线程的疑问
  1. public class Test {

  2. /**
  3. * @param args
  4. */
  5. public static void main(String[] args) {

  6. Waiting w=new Waiting();
  7. new Thread (w) .start();
  8. new Thread (w) .start();
  9. }

  10. }

  11. class Waiting implements Runnable {
  12. boolean flag = false;

  13. public synchronized void run() {
  14. if (flag) {
  15. flag = false;
  16. System.out.print("1");
  17. try {
  18. this.wait();
  19. } catch (Exception e) {
  20. }
  21. System.out.print("2");
  22. } else {
  23. flag = true;
  24. System.out.print("3");
  25. try {
  26. Thread.sleep(2000);
  27. } catch (Exception e) {
  28. }
  29. System.out.print("4");
  30. notifyAll();
  31. }
  32. }
  33. }
复制代码
疑问:这段代码的输出结果是什么?这段代码会运行结束么?

作者: 高境    时间: 2012-12-19 11:32
输出结果是314,可以运行结束~~先出现3,然后出现41
作者: 孙辉辉    时间: 2012-12-19 11:34
运行结果
很明显,代码最后输出了System.out.print("1"); 这一句,然后进行了
try {
this.wait();
}
即等待状态,而且没有唤醒其他的线程,因此就一直等待。

作者: pphdsny3    时间: 2012-12-19 18:16
孙辉辉 发表于 2012-12-19 11:34
运行结果
很明显,代码最后输出了System.out.print("1"); 这一句,然后进行了
try {

notifyAll()不会唤醒那个等待的线程么?
作者: 孙辉辉    时间: 2012-12-19 19:23
黑马王鹏 发表于 2012-12-19 18:16
notifyAll()不会唤醒那个等待的线程么?

那是else里面的语句,你后面又执行不到了,
如果想的话可以放到while(true){}里面
作者: pphdsny3    时间: 2012-12-20 09:47
孙辉辉 发表于 2012-12-19 19:23
那是else里面的语句,你后面又执行不到了,
如果想的话可以放到while(true){}里面 ...

不对呀,应该会有两个线程同时运行呀,第一个线程睡2秒的时候,第二个线程就可能已经开启了,处于等待时期了,然后被第一个线程所唤醒了,这里面会不会有线程锁的问题呀,不是同一个锁,所以唤不醒,弄不懂!???求解
作者: 孙辉辉    时间: 2012-12-20 13:26
我们可以来看看里面的线程
  1. class Waiting implements Runnable {
  2.         boolean flag = false;

  3.         public synchronized void run() {
  4.         if (flag) {
  5.         flag = false;
  6.         System.out.println(Thread.currentThread().getName());
  7.         System.out.print("1");
  8.         try {
  9.         this.wait();
  10.         } catch (Exception e) {
  11.         }
  12.         System.out.println(Thread.currentThread().getName());
  13.         System.out.print("2");
  14.         } else {
  15.         flag = true;
  16.         System.out.println(Thread.currentThread().getName());
  17.         System.out.print("3");
  18.         try {
  19.         Thread.sleep(2000);
  20.         } catch (Exception e) {
  21.         }
  22.         System.out.println(Thread.currentThread().getName());
  23.         System.out.print("4");
  24.         notifyAll();
  25.         }
  26.         }
  27. }
复制代码

结果
现在是运行到输出1,这时候是线程1等待,没有人能叫醒他了




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