java - Soalan mengenai pemberitahuan berbilang benang
给我你的怀抱
给我你的怀抱 2017-05-17 10:01:54
0
1
614
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? ?

给我你的怀抱
给我你的怀抱

membalas semua(1)
仅有的幸福

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

<p> Pelaksanaan ini menggunakan gelung panggilan {@code this.wait} yang dikondisikan pada {@code this.isAlive}. mengesyorkan agar aplikasi tidak menggunakan {@code wait}, {@code notify} atau {@code notifyAll} pada kejadian {@code Thread}.

Lihat muka tebal, sebenarnya notifyAll yang dipanggil selepas rangkaian tamat yang menyebabkan tunggu untuk bangun. Ia tidak disebabkan oleh sebarang pengoptimuman mesin maya. Semoga ia dapat menjawab kekeliruan anda
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan