站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题多线程的一点疑惑(高手入)

多线程的一点疑惑(高手入)

摘要: 多线程的一点疑惑(高手入)


程序中会有两个Thread对象: main Thread和ThreadB
当b.start();执行后, ThreadB进入Runnable状态,然后main Thread继续运行6行.
此时两个Thread可能进入Runnable状态.如果是main线程获得了b的对象lock, 那么everything is OK.
但是如果 ThreadB先获得对象lock的话,那当它执行完run()方法后, 再执行line 6的时候b.wait()就会一直等待下去. 上面的是我的分析.

但为什么我反复运行下面代码的时候,却没有发生line 6 b.wait()一直等待的情况呢???
注:当我在line 5的位置加上Thread.sleep(1000);的时候, b.wait()就开始死死等待了.但没有这句话也应该有死等的几率的. 还有如果b.wait()一直等待, 这个是否应该算deadlock?还是其它名字.

1. class ThreadA {
2. public static void main(String [] args) {
3. ThreadB b = new ThreadB();
4. b.start();
5.
6. synchronized(b) {
7. try {
8. System.out.println("Waiting for b to complete...");
9. b.wait();
10. } catch (InterruptedException e) {}
11. System.out.println("Tota7. is: " + b.total);
12. }
13. }
14. }
15.
16. class ThreadB extends Thread {
17. int total;

18.
19. public void run( ) {
20. synchronized(this) {
21. for(int i=0;i<100;i++) {
22. total += i;
23. }
24. notify( );
25. }
26. }
27. }



public class cs {
boolean available = true;

public synchronized boolean enter() {
while (available == false) {
try {
wait();
}
catch (InterruptedException e) {
return false;
}
}
available = false;
return true;
}

public synchronized void leave() {
available = true;
notify();
}
}
////////////////////////////////////////////////////下面是用法
private cs cs = new cs();
cs.enter();
xxx.setxxx(xxx);
cs.leave();



楼上的没看懂我的问题.


帮顶


哪有什么死等的几率,从概率上讲0。000000000001就是0 肯定就是deadlock了。
如果加上sleep,
ThreadB很快就执行完了。那么就没有人去notify ThreadA了,所以就deadlock了。


↑返回目录
前一篇: 求教jsp中对sql-server数据库的操作问题
后一篇: xp系统中用jsp在客户端打开excel文件的问题