【发布时间】:2021-07-21 07:52:06
【问题描述】:
我编写了一个简单的演示来模拟我面临的问题。
public abstract class ThreadPoolTest {
private static final int CORE_POOL_SIZE = 5;
private static final int QUEUE_CAPACITY = 15;
private static final int MAX_POOL_SIZE = 50;
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(QUEUE_CAPACITY);
ThreadPoolExecutor pool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, 1l, TimeUnit.SECONDS, workQueue);
execueInBatch(pool, 25);
pool.shutdown();
}
@SuppressWarnings("boxing")
private static void execueInBatch(ThreadPoolExecutor pool, int num) throws InterruptedException {
for (int i = 1; i <= num; i++) {
final Integer it = Integer.valueOf(i);
try {
System.out.println("About to start " + i);
CompletableFuture.runAsync(() -> {
System.out.println("Started- " + it);
try {
Thread.sleep(5000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Completed- " + it);
}, pool);
} catch (Exception e) {
System.err.println(e.getMessage() + " for-" + i);
}
}
}
}
回复如下:
即将开始 1
即将开始 2
即将开始 3
开始- 1
即将开始 4
开始- 2
即将开始 5
开始- 3
即将开始 6
即将开始 7
即将开始 8
即将开始 9
开始- 4
即将开始 10
即将开始 11
即将开始 12
即将开始 13
即将开始 14
即将开始 15
即将开始 16
即将开始 17
开始 - 5
即将开始 18
即将开始 19
即将开始 20
即将开始 21
即将开始 22
即将开始 23
开始 - 21
开始 - 22
开始 - 23
即将开始 24
即将开始 25
开始 - 24
开始 - 25
已完成- 1
开始 - 6
已完成- 3
已完成- 2
已完成- 4
开始 - 8
开始 - 7
开始 - 9
已完成- 5
开始 - 10
已完成- 23
已完成- 21
开始 - 11
已完成- 22
开始 - 12
开始 - 13
已完成 - 25
已完成- 24
开始 - 14
开始 - 15
已完成- 6
开始 - 16
已完成- 8
已完成- 9
开始 - 17
已完成- 7
开始 - 18
开始 - 19
已完成- 10
开始 - 20
已完成 - 13
已完成- 11
已完成 - 12
已完成 - 15
已完成 - 14
已完成 - 16
已完成 - 17
已完成 - 18
已完成 - 19
已完成 - 20
我需要在启动任务 21 之前启动任务 6。 有没有办法实现?
【问题讨论】:
-
当 N 个线程大约在同一时间拿起一个排队的项目时,除非 N=1 线程或者您在每个步骤开始时添加逻辑以等待特定计数器,否则您无法判断哪个将首先开始事件发生(所以除非事件 1 开始,否则 2 不会继续)。
标签: java queue threadpoolexecutor