a12939026 2013-01-21 10:21
浏览 181
已采纳

JAVA 多线程的问题

[code="java"]
public class ReaderResult extends Thread {
Calculator c;

public ReaderResult(Calculator c) { 
        this.c = c; 
} 

public void run() { 
        synchronized (c) { 
                try { 
                        System.out.println(Thread.currentThread() + "等待计算结果。。。"); 
                        c.wait(); 
                } catch (InterruptedException e) { 
                        e.printStackTrace(); 
                } 
                System.out.println(Thread.currentThread() + "计算结果为:" + c.total); 
        } 
} 

public static void main(String[] args) { 
        Calculator calculator = new Calculator(); 
        //启动三个线程,分别获取计算结果 
        new ReaderResult(calculator).start(); 
        new ReaderResult(calculator).start(); 
        new ReaderResult(calculator).start(); 
        //启动计算线程 
        calculator.start(); 

} 

}
[/code]
[code="java"]
public class Calculator extends Thread {
int total;
public void run() {
synchronized (this) {
System.out.println(total);
for (int i = 0; i < 101; i++) {
total += i;
}
System.out.println(total);

}
}
}
[/code]

就2个简单的类 , 以我的认识,应该在c.wait()这里卡住,也就是说应该不会输出“计算结果为:" ”这些话。 但是为什么他有时候会输出呢?(有时候不会)。 到底是什么破坏了wait 状态? 应该不是start, 因为有时候是先输出System.out.println(total)这里, 然后再打印等待计算结果。。 高人请指点下

  • 写回答

4条回答 默认 最新

  • mythsaa 2013-01-21 18:32
    关注

    应该是calculator.start();这句被执行的原因
    因为线程的执行顺序是由cpu随机分配的,当执行new ReaderResult(calculator).start()后,会在calculator.wait()这里挂起等待calculator的被执行结束或者被唤醒,当线程calculator被执行结束时,ReaderResult引用的Calculator也就执行结束了,(线程执行结束后应该会有自动唤醒机制,这是native方法,没看到具体的实现,所以c.wait()也就失效了),而那些在calculator.start()执行完成后才执行的线程,就会一直等待下去了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 Pyqt 如何正确的关掉Qthread,并且释放其中的锁?
  • ¥30 网站服务器通过node.js部署了一个项目!前端访问失败
  • ¥15 WPS访问权限不足怎么解决
  • ¥15 java幂等控制问题
  • ¥15 海湾GST-DJ-N500
  • ¥15 氧化掩蔽层与注入条件关系
  • ¥15 Django DRF 如何反序列化得到Python对象类型数据
  • ¥15 多数据源与Hystrix的冲突
  • ¥15 如何在线硕士了解,广告太多,希望有真实接触过的人回答下?(标签-学习|关键词-在线硕士)
  • ¥15 zabbix6.4与frp如何进行联动