以下のコード:
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 秒未満で実行されることを期待しています。
カウンターが別々のスレッドで同時に呼び出されないのはなぜですか?