2009-03-02 13 views
3

Javaスレッドと並行処理の世界については、私はかなり素朴です。私は現在、勉強しようとしています。私は、どのように並行処理が動作するかを調べるための簡単な例を作った。ここでJavaスレッディングチュートリアルタイプの質問

は私のコードです:

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class ThreadedService { 

    private ExecutorService exec; 

    /** 
    * @param delegate 
    * @param poolSize 
    */ 
    public ThreadedService(int poolSize) { 
     if (poolSize < 1) { 
      this.exec = Executors.newCachedThreadPool(); 
     } else { 
      this.exec = Executors.newFixedThreadPool(poolSize); 
     } 
    } 

    public void add(final String str) { 
     exec.execute(new Runnable() { 
      public void run() { 
       System.out.println(str); 
      } 

     }); 

    } 

    public static void main(String args[]) { 
     ThreadedService t = new ThreadedService(25); 
     for (int i = 0; i < 100; i++) { 
      t.add("ADD: " + i); 
     } 
    } 

} 

私は順番に番号0-99からコード印刷をするために行うには何が必要ですか?

答えて

7

Thread poolsは、通常、synchronizationを必要としない操作または高度にparallelの操作に使用されます。

番号0〜99を順番に印刷することは並行した問題ではなく、順不同印刷を避けるためにスレッドを同期させる必要があります。

Java concurrency lessonを見て、Javaで並行性を考えてみることをおすすめします。

3

問題の最も簡単な解決策は、ThreadPoolのサイズを1にすることです。しかし、これは本当にスレッドを使用して解決する問題ではありません。

あなたとあなたのexecutorを作成した場合、拡大するために:

this.exec = Executors.newSingleThreadExecutor(); 

、あなたのスレッドはすべてのスケジュール、彼らが実行のために提出された順序で実行されます。これが論理的なことであるシナリオがいくつかありますが、ほとんどの場合、スレッドはこの問題の解決に使用する間違ったツールです。

この種のことは、別のスレッドでタスクを実行する必要があるときには意味があります。実行に時間がかかり、GUIスレッドをブロックしたくないかもしれませんが、送信されたタスクが同時に実行されることを必要としないか、必要としません。

3

スレッドのアイデアは、物事を順番に行うことではありません。

調整するには共有状態が必要です。この例では、この例では外部クラスにインスタンスフィールドを追加しています。 addからパラメータを削除します。ロックオブジェクトとカウンタを追加します。ロックをつかみ、インクリメントをインクリメントし、インクリメントして番号を放します。

0

問題は定義上、スレッドには適していません。スレッドは独立して実行され、どのスレッドが最初に実行されるかを予測する方法はありません。

あなたが順番に実行するようにコードを変更したい場合は、変更はに追加:

public void add(final String str) { 
    System.out.println(str); 
} 

あなたはスレッドを使用していない(少なくとも自分自身ではない)とすべてが順次行われます。

+0

私は実際に使っているものではありません。スレッディングと同期をよりよく理解したいと思っています。 – systemoutprintln