私はスレッドをいじっていますが、なぜこれが思ったように機能しないのかわかりません。
スレッドを使用して合計を計算しようとしていますが、結果を出力するまでにスレッド プールがすべてのタスクが終了するのを待つことを期待していました (shutdown() 呼び出しと isTerminated() チェックによる)。
ここで何が欠けていますか?
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test5 {
private Integer sum= new Integer(0);
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
Test5 obj = new Test5();
for(int i=0; i<1000; i++){
pool.execute(obj.new Adding());
}
pool.shutdown();
while(!pool.isTerminated()) {
//could be empty loop...
System.out.println(" Is it done? : " + pool.isTerminated());
}
System.out.println(" Is it done? : " + pool.isTerminated());
System.out.println("Sum is " + obj.sum);
}
class Adding implements Runnable {
public void run() {
synchronized(this) {
int tmp = sum;
tmp+=1;
sum=new Integer(tmp);
}
}
}
}
良い結果が得られますが、次のような出力も得られます。
Is it done? : true
Sum is 983