22 条回复  ·  314 次点击
sagaxu 初学 2024-9-26 08:25:58
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/ExecutorService.html#shutdownNow()

There are no guarantees beyond best-effort attempts to stop processing actively executing tasks. For example, typical implementations will cancel via Thread.interrupt(), so any task that fails to respond to interrupts may nefer terminate.

Java 不能强制终止线程,杀死一个线程需要那个线程配合,检测 interrupt 标志,处理 InterruptedException 异常。


//让主线程停止阻塞立即返回, 尝试下面两个方案都不行
主线程中创建一个 CompletableFuture done ,此处完成它

CompletableFuture.anyOf(done, CompletableFuture.allOf(list.toArray)).join()

等待的条件,从 任务全部完成 变成  (任务全部完成 or i >= 2)
lolico 初学 2024-9-26 10:57:16
public static void main(String[] args) throws InterruptedException {
    List<Thread> threads = new ArrayList<>();
    final int untilSuccessCount = 2;
    final int threadCount = 10;
    AtomicInteger counter = new AtomicInteger(0);
    CountDownLatch latch = new CountDownLatch(1);
    for (int i = 0; i < threadCount; i++) {
        int finalI = i;
        Thread thread = new Thread(() -> {
            // 模拟耗时任务
            Random random = new Random();
            // 直接使用线程的 interrupt 中断标记
            while (!Thread.interrupted()) {
                try {
                    Thread.sleep((long) finalI * 1000);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    return;
                }
                if (random.nextBoolean()) {
                    if (counter.incrementAndGet() == untilSuccessCount) {
                        latch.countDown();
                    }
                    return;
                }
            }
        });
        thread.start();
        threads.add(thread);
    }
    // 可以启动一个线程,等待所有 thread 完成后 latch.countDown ,防止一直等待。
    // 或者加一个 allDoneLatch 也可以实现
    latch.await();
    threads.forEach(Thread::interrupt); // 中断其他线程
    System.out.println(counter.get());
}
123
返回顶部