1

以下のコード:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadTest {

    private static int counter = 0; 
    private static ExecutorService executorService = Executors.newCachedThreadPool();
    private static List<Integer> intValues = new ArrayList<Integer>();

    public static void main(String args[]){
        for(int counter = 0; counter < 10; ++counter){
            intValues.add(testCallback());
        }

        for(int i : intValues){
            System.out.println(i);
        }

        System.exit(0);
    }

    public static Integer testCallback() {

        Future<Integer> result = executorService.submit(new Callable<Integer>() {
            public Integer call() throws Exception {
                counter += 1;
                Thread.sleep(500);
                return counter;
            }
        });

        try {
            return result.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        return null;
    }
}

出力:

1
2
3
4
5
6
7
8
9
10

このプログラムの実行には約 5 秒かかります。別のスレッドで testCallback メソッドの複数の呼び出しを実行しようとしているため、このメソッドは、各スレッドが約 500 ミリ秒の時間を使用する 10 個のスレッドで同時に実行されると予想されます。したがって、全体として、プログラムが 1 秒未満で実行されることを期待しています。

カウンターが別々のスレッドで同時に呼び出されないのはなぜですか?

4

1 に答える 1

10
result.get();

これは、タスクの完了を待機するブロッキング呼び出しです。

したがって、次のタスクを開始する前に、各タスクが完了するのを待っています。

于 2013-09-10T15:00:55.077 に答える