1

由于服务是单线程的,monkey1 循环序列总是在monkey2 之前执行,所以我们可以预期monkey1 总是大于monkey2,不是吗?

import java.util.concurrent.*;

public class MonkeyCounter {
    private static AtomicInteger monkey1 = new AtomicInteger(0); 
    private static AtomicLong monkey2 = new AtomicLong(0);

    public static void main(String[] args) {
      ExecutorService service = null;
      try {
        service = Executors.newSingleThreadExecutor(); 

        for(int i=0; i<100; i++)
        service.submit(() -> monkey1.getAndIncrement()); 
        for(int i=0; i<100; i++)
        service.submit(() -> monkey2.incrementAndGet());
        System.out.println(monkey1+" "+monkey2); 
      } finally {
       if(service != null) service.shutdown();
      }
    }
}
4

2 回答 2

3

Executors.newSingleThreadExecutor上的 Javadoc :

创建一个使用单个工作线程在无界队列上运行的 Executor。(但请注意,如果该单线程在关闭前的执行过程中因失败而终止,则如果需要执行后续任务,则新线程将取代它。)任务保证按顺序执行,并且不会有多个任务处于活动状态在任何给定的时间。与其他等效的 newFixedThreadPool(1) 不同,返回的执行程序保证不可重新配置以使用额外的线程。

任务被放置在一个队列中。队列是 FIFO,因此对于单线程,monkey1 > monkey2如果没有任何增量失败,则可以保证。

请记住monkey1和的值monkey2是不确定的,因为您不等待作业完成。

于 2019-09-11T03:10:33.427 回答
0

在霍尔格纠正我之后,Executors.newSingleThreadExecutor() 任务保证按顺序执行。

在下面的示例中,即使提交的第一批任务阻塞了 5 秒,也比第二批没有阻塞的任务先完成println

例如

import java.util.concurrent.*;

public class ExecutorServiceTests {

    public static void main(String[] args) {
        java.util.concurrent.ExecutorService service = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 5; i++) {
            service.submit(() -> {
                block(5000);
                System.out.println("execution1");
            });
        }

        for (int i = 0; i < 5; i++) {
            service.submit(() -> {
                System.out.println("execution2");
            });
        }

        service.shutdown();
    }

    private static void block(int ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

输出:

execution1
execution1
execution1
execution1
execution1
execution2
execution2
execution2
execution2
execution2
于 2019-09-11T02:59:47.097 回答