2016-11-27 3 views
0

私はthreadExecutorのobjecctsを2つ持っていると仮定して待機を実行したい、そのobjecctに通知することができます。ここでどのように実装するには、Javaでthreadexecutorで通知する

+0

「threadExecutor」はどういう意味ですか?あなたは "ThreadPoolExecutor"を参照していますか? ExecutorService?関連するコードを表示し、より多くの背景情報を与えることができますか? –

+0

@HovercraftFullOfEels offcourse –

答えて

0

はJavaでThreadExecutorで通知を待つの使用例である:

キーワードは排他的アクセスのために使用されているが、同期

public class ExecutorServiceTest { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     ExecutorService executor = Executors.newFixedThreadPool(2); 
     ThreadB threadB = new ThreadB(); 
     ThreadA threadA = new ThreadA(threadB); 

     executor.execute(threadA); 
     executor.execute(threadB); 

     executor.shutdown(); 
     while (!executor.isTerminated()); 
     System.out.println("Finished all threads"); 

    } 

    static class ThreadA extends Thread { 

     private final ThreadB waitThread; 

     public ThreadA(ThreadB waitThread) { 
      this.waitThread = waitThread; 
     } 

     @Override 
     public void run() { 
      synchronized (waitThread) { 
       try { 
        waitThread.wait(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       System.out.println("B Count Total : " + waitThread.getCount()); 

       for (int i = waitThread.getCount(); i < 200; i++) { 
        System.out.println("A Counting " + i); 
       } 
      } 
     } 
    } 

    static class ThreadB extends Thread { 

     private int count = 0; 

     @Override 
     public void run() { 
      synchronized (this) { 
       while (count < 100) { 
        System.out.println("B Counting " + count); 
        count++; 
       } 
       notify(); 
      } 
     } 

     public int getCount() { 
      return count; 
     } 

    } 

} 

メソッドを同期させるには、単にsynchronizedキーワードをその宣言に追加します。同じオブジェクト上に同期メソッドを2回呼び出すと、相互にインターリーブすることはできません。

同期のステートメントは、固有ロックを提供するオブジェクトを指定する必要があります。

待機()

をいくつかの他のスレッドが入るまでモニターを放棄し、スリープ状態に入るために、呼び出し元のスレッドを伝えます同じモニターと呼び出しnotify()。

)(通知同じオブジェクトを待機と呼ばれる最初のスレッド()を起動します。

+0

私はこの方法を知っていますが、Executorを使って行うことができます –

+0

@pankajlal答えを更新しました。ThreadExecutorを使って待機して通知してください –

+0

ありがとう –

関連する問題