java线程问题 在线等急

来源:百度知道 编辑:UC知道 时间:2024/05/03 07:53:30
package test;

import java.util.LinkedList;

public class Test_2_A2 {

public static void main(String[] args) {
SubTreadOne one = new SubTreadOne();
SubTreadTwo two = new SubTreadTwo(one);
two.start();
try {

Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
one.start();

}

}

class SubTreadOne extends Thread {

public SubTreadOne() {
}

public void run() {
try {
System.out.println("sleep");
Thread.sleep(3000);
synchronized (this) {
this.notifyAll();
}
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}

class SubTreadTwo extends Thread {

SubTreadOne one;

public SubTreadTwo(SubTreadOne one) {
this.one = one;
}

public SubTreadTwo()

当wait的时候其实就是已经放出了线程的控制权,所以one可以运行。one运行时调用notify后又唤醒了two线程
所以打印顺序才是
wait
sleep
wake up

我觉得我解释的已经很清楚了
wait被调用的时候放弃锁,而控制线程是否能使用内容的关键就在于锁,wait并不是thread的内容,而来自于object。
你可以这样来理解wait,我wait下就把接力棒交出去了,我当前的这个线程就暂停运行,记住是当前的线程。然后当我交出的接力棒已经又回到我手中的时候,也就是说其他的线程已经完成了任务。这个时候我拿到接力棒继续奔跑。
有时候你应该把问题简单化,建议你看看thinking in java第四版
我明白你是想观察阻塞的出现,你可以将one。start放到two。start的上边就会明白什么意思了