public class Threadwait {
// 特殊之处 锁对象 是线程对象
public static void main(String[] args) {
Object o = new Object();
ThreadB2 b = new ThreadB2();
b.start();
// b.start(); 一个线程只能开启一次
//等待 唤醒方法只能用在同步中,同时调用wait和notify的对象必须是锁对象
synchronized (b) {//如果锁对象换成O(wait的对象也也要换成O)会出现什么情况 主线程会等待 因为没有被唤醒
try {
System.out.println("Waiting for b to complete...");
// 一个sleep的时候 一个wait的时候 两个wait的时候 三个一起的时候
b.wait();//调用wait的对象只能是锁对象
b.sleep(4000);//调用sleep的对象只能是锁对象
b.wait(4000);//第二次调用wait才出现等待效果
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("Total is: " + b.total);
}
}
class ThreadB2 extends Thread {
int total;
@Override
public void run() {
System.out.println("run");
for (int i = 0; i < 10; i++) {
total = i;
}
}
}
//输出为Waiting for b to complete...和9
//但是 主线程已经b.wait()了 如果没被b.notify()唤醒,其之后的代码是不会被执行的
//有输出,说明b.start这个方法执行完时会唤醒b对象监听的所有线程,这个事情挺神奇,
//我以前还不知道,测试了下才发现这个事。
// 如果同步中的锁是 线程对象的话 那么第一次wait()会失效(可能被之前start()抵消??) 第二次调用wait才出现等待效果
// 但是只有sleep(long)只有一个的时候 效果存在 因为sleep(long) 不需要被唤醒不受start()影响?? 只要时间到自然会醒???
一个sleep的时候 一个wait的时候 两个wait的时候 三个一起的时候 代码执行情况 有什么区别???求解