スレッド通信の例:2つのスレッドを使用して1〜100を印刷します。スレッド1、2は交互に印刷します

スレッド通信の例:2つのスレッドを使用して1〜100を印刷します。スレッド1、2は交互に印刷します。関連
する3つのメソッド
は、このメソッドが実行されると待機し、現在のスレッドがブロッキング状態に入り、同期モニターを解放します。
このメソッドが実行されると、notifyは
待機中のスレッドをウェイクアップします。複数のスレッドが待機している場合、優先度の高いスレッドがウェイクアップされます。Notifyall。このメソッドが実行されると、待機中のすべてのスレッドウェイクアップされます。
注意点:
1。wait()notify()notifyall()メソッドの呼び出しは、同期コードブロックまたは同期メソッドでのみ使用できます。
2.wait()notify()notifyall()3つのメソッドの呼び出し元は、同期コードブロックまたは同期メソッドの同期モニターである必要があります。そうでない場合、illegalMonitorStateExceptionが発生します
。3.wait()notify()notifyall()はlavaで定義されます。 .long.Objectクラス

//线程通信的例子:使用两个线程打印1-100.线程1,2交替打印
class Number implements Runnable{
    
    
    private static int number = 1;
    @Override
    public void run() {
    
    
        while (true){
    
    
            synchronized (this) {
    
    
                notify();
                if (number <= 100) {
    
    
                    try {
    
    
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + ":" + number);
                    number++;
                    //使得调用如下wait()方法的线程进入阻塞状态
                    try {
    
    
                        wait();
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }

                }else{
    
    
                    break;
                }
            }
        }
    }

public static class why {
    
    
    public static void main(String[] args) {
    
    
        Number number = new Number();
        Thread t1 = new Thread(number);
        Thread t2 = new Thread(number);
        t1.start();
        t2.start();
        t1.setName("线程1");
        t2.setName("线程2");

    }
}
}

面接の質問:

Sleepメソッドとwaitメソッドの類似点と相違点
1.類似点:メソッドが実行されると、現在のスレッドはブロッキング状態に入ることができます
。2。相違点:(1)2つのメソッド宣言は異なる位置にあります。sleepはスレッドで宣言されます。クラスとスリープはオブジェクトクラスで宣言されます。待機;(2)呼び出し要件が異なります:スリープは必要なシーンで呼び出すことができます;待機は同期コードブロックまたは同期メソッドで使用する必要があります;(3)同期モニターを解放します。両方のメソッドが同期コードブロック内にあるか、同期メソッドでは、sleepはロックを解放しません。waitはロックを解放します。

おすすめ

転載: blog.csdn.net/HenryFanQAQ/article/details/110728818