2016-05-30 14 views
-2

編集: 1)なぜ "globalCounter" は同期ですが、ない "にThread.currentThread()のgetId()。"のJava-スレッドプール - Thredsを同期

2)私はそれぞれに計算を割り当てることができます糸?どうやって?結果を扱うことはできますか?

public class Hauptprogramm { 

public static final int MAX_THREADS = 10; 
public static int globalCounter; 
public static Integer syncObject = new Integer(0); 


public static void main(String[] args) { 


    ExecutorService threadPool = Executors.newFixedThreadPool(MAX_THREADS); 
    for (int i = 0; i < MAX_THREADS; i++) { 

      threadPool.submit(new Runnable() { 

       public void run() { 
        synchronized (syncObject) { 
        globalCounter++; 

        System.out.println(globalCounter); 
        System.out.println(Thread.currentThread().getId()); 


        try { 
         Thread.sleep(10); 

        } catch (InterruptedException e) { 

        } 

             } 
       }}); 

     } 

    threadPool.shutdown(); 

} 
    } 
+0

実行されているすべての作業に対して同じものがすべて同期していると、どうして苦労しますか? – user2864740

+1

これはどの言語が尋ねていますか? –

+0

@ user2864740私は自分の質問を編集します。多分もっと明確になった – Cashew

答えて

1

1)なぜ "globalCounter" 同期ではなく、 "にThread.currentThread()。のgetId()"

globalCounterが同期される理由を、私は答えることができます。データ競争と競合状態を回避する。場合

それが同期していない場合 - globalCounter++計算は3つの段階プロセスである(リードモディファイライト) -

  1. globalCounter varaibleの現在の値を読みます。
  2. その値を変更します。
  3. 変更した値をglobalCounterに書き込み/割り当てし直します。マルチスレッド環境におけるsynchronizationの非存在下で

、スレッドが読み取り/可能性がある別のスレッドがこの3段階のプロセスの中間にある場合globalCounterの値を変更します。

これは、スレッド/ sが古い値を読み取るか、更新回数が失われる可能性があります。

2)各スレッドに計算を割り当てることはできますか?どうやって?結果を扱うことはできますか?

これも可能です。あなたはFuture/FutureTaskを調べて結果を扱うことができます

+0

私は呼び出し可能で未来が必要です。さもなければスレッドIDを同期できません。 (私はcallableとfutureを扱う例を見つけました) – Cashew

+0

タスクの実行によって返された結果に興味があるなら、 'Callable'に行きます。 'Future'は、その結果を取得するための契約を定義します。あなたが 'スレッドIDを同期することはできません。 ' – Tirath

+0

globalCounterのアウトプリントは "1,2,3..10"ですが、私がthread.idを外したとき、idはランダムです。 (17,15,11 ...)。 – Cashew