程序中会有两个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. }
当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. }
解决方案 »
- java程序存储图片的问题
- sql中的check约束 在项目中使用么?
- 请教各位高手大大,如何能展现远程打开文件的进度条?
- 编写邮件程序时,无法显示主题,
- 运行出现”EXCEPTION in tread "main"java.lang.noclassdefounderror:test“是怎么了啊
- java基础知识总结
- 请问 哥哥姐姐你是怎么学java类的?
- [IBM][JDBC Driver] CLI0620E IOException, error reading from input stream. SQLSTATE=428A1
- 一个入门级问题...
- 大家看看这篇文章?我调试不能通过!
- 关于Calendar类的一些疑问
- 这个是个计算器的界面 可是我做的有错误 我调节不出来 希望哪位高手给我解决了 谢谢!~~~
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();
如果加上sleep,
ThreadB很快就执行完了。那么就没有人去notify ThreadA了,所以就deadlock了。