スレッド間の通信

4470 ワード

スレッド間の通信:
  • ウェイクアップ待ちメカニズム-複数のスレッドが同じデータを操作する場合、同じ変数の競合を回避
    目的:資源の有効利用重点:資源占有に対する判断

  • TimeWaiting-タイミング待ち
  • sleep(long m)法を用いて,スレッドの覚醒はRunnable/Blocked(閉塞状態)
  • に入る.
  • はwait(long m)を用いる、ミリ秒値が終了した後、起動されなければ閉塞状態
  • に入る.
  • 注:notifyは同じロックオブジェクトのみを起動します
  • waitとnotifyは、同期コードブロックまたは同期方法で
  • を使用する必要がある.
  • ロックオブジェクト呼び出し
  • public class ThreadWaitNotifyAll {
        public static void main(String[] args) {
            Object obj = new Object();
            //           
            new Thread("     "){
                @Override
                public void run() {
                    //             ,      
                    synchronized (obj) {
                        System.out.println("   :       ,  2s");
                        try {
                            obj.wait(2000);  //    ,     
                            System.out.println("   :   ,    ,    ");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }
                }
            }.start();
            new Thread("   1  "){
                @Override
                public void run() {
                    //             ,      
                    synchronized (obj) {
                        System.out.println("   01:       ,  2s");
                        try {
                            obj.wait(2000);  //    ,     
                            System.out.println("   01:   ,    ,    ");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }
                }
            }.start();
    
            //       
            new Thread("    "){
                @Override
                public void run() {
                    //      5s
                    System.out.println("  :     5s ");
    
                    synchronized (obj) {
                        System.out.println("  :    ,   ");
                        //             obj.notify();
                        //        ,    ,        ,    RUNNABLE
                        //      ,          entry set,WAITING  BLOCKED  
    
                        //    
                        obj.notifyAll();
                    }
    
                }
            }.start();
    
    
        }
    }

    起動待ちのケース:
  • は、WAITING状態(無制限待ち)
  • に入るように別のスレッドに通信が必要であることを通知するスレッドを作成する.
  • 別のスレッドを作成し、前のスレッド
  • を起動します.
  • 注:顧客とボススレッドは同期コードブロックでロックされ、実行中であることを保証しなければならない.
  • 同期ロックオブジェクトは、一意の
  • を保証する必要があります.
  • ロックオブジェクトのみwait()/notify()メソッド
  • を呼び出すことができる.
  • Objectクラス
    void wait()は、他のスレッドがこのオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出す前に、現在のスレッドが待機します.void notify()は、このオブジェクトモニタで待機している単一のスレッドを起動します.void notifyAll()は、このオブジェクトモニタで待機しているすべてのスレッドを呼び出し、wait後のメソッドを実行し続けます.
  • public class ThreadState {
        public static void main(String[] args) {
            Object obj = new Object();
            //           
            new Thread("     "){
                @Override
                public void run() {
                    //             ,      
                    synchronized (obj) {
                        System.out.println("   :       ");
                        try {
                            obj.wait();  //    ,     
                            System.out.println("   :   ,    ,    ");
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                    }
                }
            }.start();
    
            //       
            new Thread("    "){
                @Override
                public void run() {
                    // 5     
                    try {
                        System.out.println("  :  ,         ");
                        Thread.sleep(0000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    //      
                    synchronized (obj) {
                        System.out.println("  :    ,   ");
                        obj.notify();  //       ,  wait     ,         
                        //         cpu    ,     ,        
                        System.out.println("  :  ,       ");
                    }
                    //            
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //      
                    System.out.println("  :   ");
                }
            }.start();
    
    
        }
    }