2011-10-03 4 views
0

イベント/アップデートを待つ最善の方法は何ですか?たとえば、何かをする前にこのデータ構造が更新されるのを待っています。ループ内でそれを実装すると、それは次のように多くのCPU時間を消費するための最良の方法ではありません。更新を待つ

while (true) { 
    // keep checking the data structure 
    // if data structure is updated 
    // break; 
} 
// do something here 

Javaでこのような何かを実装するために単純だが効率的な方法は何ですか?

答えて

1

wait-notifyAllはループよりも効率的です。待機用

標準イディオム():

synchronized (obj) { 
    while(condition not hold) 
     obj.wait(); 
} 

しかし、それはスレッドを制御する原始的な方法ですが、あなたはjava.util.concurrentパッケージに活用クラスを思います。さらに、私がこのような問題を抱えたら、クリス・デイルの答えを選びます。

1

本当に残りのプログラムの構造によって異なります。私はおそらくjava.util.concurrentを見てそこに何かがあなたに合っているかどうかを見ることから始めるでしょう。あなたがこれを行うことができます方法の

例:

  • 先物 - あなたには、いくつかの仕事」が行われる必要がある場合、あなたが仕事を実行するためのスレッドプールエグゼキュータのサービスを持つことができます。 submit()に電話をして作業を行うと、作業が完了するまで確認またはブロックすることができます。

  • キュー - 作業を行うコンポーネントが1つあり、待機中のコンポーネントが1つある場合は、キューとの通信を行うことができます。データの処理が完了するたびに、キューに追加することができます。 LinkedBlockingQueueとpoll()を使用して作業を完了できます。

  • リスナー - リスナー/オブザーバーパターンを使用することもできます。

アプリケーションの構造によっては、さまざまなオプションがあります。

+0

この情報もありがとうございます。 – jasonline

0

これは私が行うコードサンプルです。

このロジックでは、スレッドでjoinメソッドを使用します。これにより、メインスレッドの実行が続行される前に、すべてのスレッドが結合されます。あなたのコードを追加する必要がある場所にTODOを入れました

import java.util.ArrayList; 
import java.util.List; 

public class MultiThread extends Thread{ 

    public void run() { 
     System.out.println("Starting Thread - " + this.getName()+this.getThreadGroup()); 
     //TODO data structure is updated here 
    } 

    public static void main(String[] args) { 
     List dataStructureList = new ArrayList() ;//TODO need to replace with list of data structure 
     //TODO dataStructureList contain list of items 
     Thread[] threadArr = new Thread[dataStructureList.size()]; 
     for (int j = 0; j < threadArr.length; j++) { 
      threadArr[j] = new MultiThread(); 
      threadArr[j].setName("Thread " + j); 
      threadArr[j].start(); 
     } 
     try { 
      for (int j = 0; j < threadArr.length; j++) { 
       threadArr[j].join(); 
      } 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("All thread finished"); 
     //TODO do something here 

    } 
} 
0

アプリケーションでマルチスレッドを使用しているとします。複数のスレッドで1つのオブジェクトを使用するには、同期を使用する必要があります。一方のスレッドがデータ構造を初期化している間、他方は初期化の終了を待つ。このロジックは通常、どのオブジェクトでも呼び出せるwait/notifyメソッドを使用して実装されます。

while (initialized) { 
    synchronized (object) { 
    object.wait(); 
    } 
} 

初期化スレッド:スレッド(S)作業

synchronized (object) { 
    // initialization 
    initialized = true; 
    object.notifyAll(); 
} 

objectを初期化しなければならないデータ構造です。 initializedフラグは、初期化が完了したことを示すために使用されます。waitが対応できない場合がありますが、notifyという場合がありますので、このフラグを使用する方が良いです。

関連する問題