2012-02-23 4 views
2

タイトルからアイデアの実証のためのサンプルコード:Javaコンカレントパッケージのエグゼキュータは、すべてのタスクが実行依頼された順序で実行されることを保証しますか?

executor.submit(runnable1); 
executor.submit(runnable2); 

私はrunnable1がrunnable2開始前に終了しますと、私は執行ドキュメントのような行動のいずれかの証拠を発見していないことを確認する必要があります。

問題について私は解決しています: ファイルにたくさんのログを書き込む必要があります。各ログには多くの事前計算(書式設定など)が必要です。そこで、各ロギングタスクを一種のキューに入れ、これらのタスクを別のスレッドで処理したいと考えています。もちろん、ログを整理することは重要です。

答えて

4

シングルスレッドエグゼキュータは、送信された順序ですべてのタスクを実行します。タスクを同時に実行するには、複数のスレッドを持つスレッドプールを使用します。

キューにタスクを追加すること自体が高価になる可能性があります。あなたは、キューを使用するか、オブジェクトを作成し、この

http://vanillajava.blogspot.com/2011/09/exchange-and-gc-less-java.html?z#!/2011/09/exchange-and-gc-less-java.html

この避けるように交換器を使用することができます。

もっと速い選択肢は、バックグラウンドスレッドを必要としないメモリマップファイルを使用することです(実際にはOSはバックグラウンドで動作しています)。サブマイクロ秒の待ち時間と、毎秒数百万のメッセージをサポートします。

https://github.com/peter-lawrey/Java-Chronicle

0

あなたはすべてのあなたのランナブルは、同じスレッド(すなわち順次)で実行されるように以下のような単純なラッパーを作成することができ、その代わりに、エグゼキュータにそのラッパーを提出します。これはログの問題には対処しません。

class MyRunnable implements Runnable { 

    private List<Runnable> runnables = new ArrayList<>(); 

    public void add(Runnable r) { 
     runnables.add(r); 
    } 
    @Override 
    public void run() { 
     for (Runnable r : runnables) { 
      r.run(); 
     } 
    } 

} 

//...... 
MyRunnable r = new MyRunnable(); 
r.add(runnable1); 
r.add(runnable2); 
executor.submit(r);  
0

おそらく、あなたはログファイルのいくつかの事後分析を行っていますか?あなたが書かれた順序について気にしないで、後でオフラインで再注文することを考慮しましたか?タイムスタンプまたはAtomicLongを使用して、送信時に一意のIDを割り当てることができますか?あなたは再発注を支援するためにNDCMDCを使用して、log4jのようなものを使用している場合にも、考える

import java.util.concurrent.atomic.AtomicLong; 

class MyProcessor { 

    public void work() 
     for (Object data: allData) { 
      executor.submit(new MySequencedRunnable(data); 
     } 
    } 

} 

class MySequencedRunnable implements Runnable { 
    private static final AtomicLong LOG_SEQUENCE_ID = new AtomicLong(0); 

    private final Object data; 

    MySequencedRunnable(Object data) { 
     this.data = data; 

    } 

    public void run() { 
     LOGGER.log(LOG_SEQUENCE_ID.incrementAndGet(), data); 
    } 

}

コードスケッチ(未テスト)は、このようになります。 。

関連する問題