通信スレッド - Javaのマルチスレッド(5)

通信スレッド

はじめに:
使用2つのスレッドが1-100を印刷します。1スレッド、2代替印刷スレッド
のみ同期ロック場合は、印刷と対話することができますが、この時点ではなく、別の印刷を完了することはできません

package JavaThread;
class Window implements Runnable{
    private int num=1;
   public void run(){
       while(true){
           synchronized(this){
               if(num<=100) {
                   try {
                       Thread.sleep(10);
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
                   System.out.println(Thread.currentThread().getName() + "打印:" + num);
                   num++;
               }else{
                   break;
               }
           }
       }
   }
}
public class Test {
    public static void main(String[] args) {
        Window w=new Window();
        Thread t1=new Thread(w);
        Thread t2=new Thread(w);

        t1.setName("线程一");
        t2.setName("线程二");

        t1.start();
        t2.start();
    }
}

あなたは、彼らが完了するために、スレッド間の代替通信を完了するために使用する印刷したい場合は、2と自分自身をスレッドすることが不可欠であるCPUを印刷した後、スレッドがブロックされたときに、スレッド2は、同じ理由であります

この方法は、使用する必要があります
待機を()と((通知)とのnotifyAll

  1. 待機():現在のスレッドがハングを作り、CPUをあきらめ、他のスレッドのためのリソースや待ち時間の同期が共有リソースにアクセスして変更することができ、別のスレッドを待機している現在のスレッドがnotify()あるいはnotifyAll()メソッドの覚醒、覚醒待ちを呼び出しますモニターのすべてを取り戻すために
    継続する権利を。
  2. 通知():同期リソースの終わりを待つために最も優先度の高いスレッドのウェイクアップキューイング
  3. notifyAll():ウェイクリソースが待機の終了を待っている全てのスレッドを並べています。

注意:

  • これら3つの方法が、それ以外の場合はjava.lang.IllegalMonitorStateException例外が報告され、同期方法でのみ使用されるか、またはコードのブロックを同期させることができます。
  • これらの3つの方法がコールするロックオブジェクトを持っている必要がありますが、これらの三つの方法が唯一のObjectクラス内で宣言することができますので、任意のオブジェクトは、同期同期ロックとして使用することができますので。

待機()メソッド

  • 現在のスレッドで呼び出しメソッド:オブジェクト名.WAIT()
  • オブジェクトの他のスレッドまで待つ(オブジェクト)に、現在のスレッドの通知を発行する
    (またはのnotifyAll)これまでのところ。
  • メソッドを呼び出すために必要な条件:現在のスレッドがオブジェクトを監視する権利を持っている必要があります(ロック)
  • このメソッドを呼び出した後、現在のスレッドは、右のモニターにオブジェクトを解放した後、待ち時間を入力します
  • 現在のスレッドの後、通知監視する権利を回復するために、次にブレークポイントからのコードを実行し続けています。

通知()/のnotifyAll()

  • 現在のスレッドで呼び出しメソッド:オブジェクト名.notify()
  • 機能:監視権限/すべてのスレッドのオブジェクトのためのウェイク待機。
  • メソッドを呼び出すために必要な条件:現在のスレッドがオブジェクトを監視する権利を持っている必要があります(ロック)
class Number implements Runnable{
    private int number=1;
    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++;
                    try {
                        //使得调用 wait()方法的线程进入阻塞状态会释放锁
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}
public class Thread01 {
    public static void main(String[] args) {
        Number nu=new Number();
        Thread t1=new Thread(nu);
        Thread t2=new Thread(nu);
        t1.setName("线程1");
        t2.setName("线程2");
        t1.start();
        t2.start();
    }
}

同期ブロックラインに入るときChengyiギャングスレッドが印刷NUM待ち()状態に入る外側を、待機2つのスレッドが、スレッドのリリースは同期コード内のロックは、2つのブロック、ステップ共感されるように、二つのスレッドを起動します。

類似点と相違点の睡眠()と待機()の

  1. 同じ点:メソッドが実行されると、これ現在のスレッドがブロック状態に入ることができること。
  2. 異なる点:1)メソッド宣言の2つの異なる位置:Threadクラス宣言睡眠()、オブジェクトクラス宣言待ち()
  3. 睡眠()任意の場面で呼び出すことができますさまざまな要件を呼び出します。待機()を使用しなければならない、又はブロック同期符号同期方法
  4. 同期解除するかどうかモニター:両方の方法は、同期コード・ブロックや同期の方法で使用されている場合は、睡眠は()(待って、ロックを解除しません)ロックを解除します。

おすすめ

転載: blog.csdn.net/qq_42193790/article/details/104440990