java - ExecutorService:输出不是预期的

标签 java runnable executorservice java.util.concurrent

我很难理解输出。这里我创建了一个执行器,然后向它提交一个 Runnable 任务 1000 次。预期输出是 1000,因为我在 Runable 内部添加了 synchronized,但实际输出不是,例如 503。任何人都可以帮我解释一下吗?

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 中放置一个简短的 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);

关于java - ExecutorService:输出不是预期的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47214262/

相关文章:

java - Camel PGP 加密和对称 key

java - Spring批处理-通过提取自动生成的 key 写入两个表

java - 如何关闭在我的java应用程序中运行的所有线程?

java - 使用 ExecutorService 时,线程内的类是否安全?

java - 使用双冒号 (::) 调用 ExecutorService 中的方法

java - 关于异常派生类的警告

java - 如何在 Java 中跨 JPanel 移动图像?

java - runnable.run() 不能抛出异常

java - 从线程外部、线程运行内部设置 boolean 值

java - ExecutorService.awaitTermination() 永远不会超时