public class WaitTest {
static class ThreadA extends Thread {
public ThreadA(String name){
super(name);
}
@Override
public void run() {
synchronized (this){
System.out.println(Thread.currentThread().getName()+" call notify()");
//notify();//notify之后 要等到这个代码块结束之后才会把锁让出去,当然如果在notify之后又有wait,那就会主动把锁让出去
try {
System.out.println(Thread.currentThread().getName()+" wait");
//wait();
//Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" after notify");
}
}
}
public static void main(String[] args) throws InterruptedException {
ThreadA t1 =new ThreadA("t1");
synchronized (t1){
System.out.println(Thread.currentThread().getName()+" start t1");
t1.start();
System.out.println(Thread.currentThread().getName()+" wait");
t1.wait();//
//System.out.println(Thread.currentThread().getName()+" notify");
// t1.notify();
System.out.println(t1.getName());
System.out.println(Thread.currentThread().getName()+" continue");
//t1.notify();
}
}
}
Secara logiknya, t1.wait() sepatutnya menyekat utas utama, dan tiada tempat lain untuk memberitahu
Dan selepas mengalih keluar t1.start(), ia akan disekat
Apakah maksudnya? Pengoptimuman pengkompil? Atau jika monitor tidak dikendalikan dalam blok kod disegerakkan, pemberitahuan aktif akan tamat? ?
Ini bukan pengoptimuman Sebenarnya, ia berkaitan dengan pelaksanaan utas. Dalam java doc,
public final synchronized void join(long millis)
Komen kaedah ini mempunyai ayat tertulis di atasnya