ExecutorService:输出不是预期的
ExecutorService: the output is not expected
我很难理解输出结果。这里我创建一个执行器,然后向它提交一个Runnable
任务1000次。预期输出是 1000,因为我在 Runable
中添加了 synchronized
,但实际输出不是,例如 503。谁能帮我解释一下? bv
public class FutureTest {
int count=0;
public void testExecutor(){
CountDownLatch counter = new CountDownLatch(1000);
Runnable incr = ()->{
//System.out.println("count="+count);
synchronized(this){
count++;
}
counter.countDown();
};
ExecutorService service = Executors.newFixedThreadPool(10);
IntStream.range(0, 1000).forEach(i->service.submit(incr));
counter.await();
service.shutdown();
System.out.println(count);
}
public static void main(String[] args) {
new FutureTest().testExecutor();
}
}
您正在打印调用线程中的计数,并且是在调用计算线程中的所有 Runnable 代码之前。只需在您的 Runnable 中放一个短 Thread.sleep 即可看到计数甚至更少。
public void testExecutor(){
Runnable incr = ()->{
//System.out.println("count="+count);
synchronized(this){
try {
Thread.sleep(10);
catch (InterruptedException e){}
count++;
}
};
您需要在所有线程完成其操作时使用一些通知,例如倒计时闩锁或 .awaitTermination(...)
。
IntStream.range(0, 1000).forEach(i->service.submit(incr));
service.shutdown();
try {
service.awaitTermination(1000, TimerUnit.SECONDS);
} catch (InterruptedException e){}
System.out.println(count);
我很难理解输出结果。这里我创建一个执行器,然后向它提交一个Runnable
任务1000次。预期输出是 1000,因为我在 Runable
中添加了 synchronized
,但实际输出不是,例如 503。谁能帮我解释一下? bv
public class FutureTest {
int count=0;
public void testExecutor(){
CountDownLatch counter = new CountDownLatch(1000);
Runnable incr = ()->{
//System.out.println("count="+count);
synchronized(this){
count++;
}
counter.countDown();
};
ExecutorService service = Executors.newFixedThreadPool(10);
IntStream.range(0, 1000).forEach(i->service.submit(incr));
counter.await();
service.shutdown();
System.out.println(count);
}
public static void main(String[] args) {
new FutureTest().testExecutor();
}
}
您正在打印调用线程中的计数,并且是在调用计算线程中的所有 Runnable 代码之前。只需在您的 Runnable 中放一个短 Thread.sleep 即可看到计数甚至更少。
public void testExecutor(){
Runnable incr = ()->{
//System.out.println("count="+count);
synchronized(this){
try {
Thread.sleep(10);
catch (InterruptedException e){}
count++;
}
};
您需要在所有线程完成其操作时使用一些通知,例如倒计时闩锁或 .awaitTermination(...)
。
IntStream.range(0, 1000).forEach(i->service.submit(incr));
service.shutdown();
try {
service.awaitTermination(1000, TimerUnit.SECONDS);
} catch (InterruptedException e){}
System.out.println(count);