求助: Java 多线程如何终止其它线程

查看 60|回复 4
作者:Alextrasza   
主线程去调用 10 个子线程查询任务(返回 true/false), 在回调中统计结果,
我想在得到两个 true 时主线程立即返回 true, 不管其他的子线程时已提交到线程池还是未提交到线程池, 都不需要了
我尝试了CompletableFuture#cancel, 和Executor#shutDownNow方法, 都没达到效果
ThreadPoolExecutor executor = newFixedThreadFool(10);
List
                if(b && i.incrementAndGet >= 2 ){
                        //让主线程停止阻塞立即返回, 尝试下面两个方案都不行
                        executor.shutDownNow();
                        list.forEach(f->f.cancel(true));
                }
))
// 希望通过某种方式让此处停止阻塞
CompletableFuture.allOf(list.toArray).join()
return i.get()>=2;
目前的方案是把后续流程放在了子线程回调中, 加锁处理, 主线程不要返回值了, 应该是可行的,
但是还是想请问大家, 原来的"主线程提前返回"的想法能否实现?
thetbw   
在任何耗时的方法前,循环中间都判断一下 Thread.currentThread().isInterrupted(),如果为 true ,就 return ,或者抛出中断异常。就可以达到线程终止的目的了。
如果要终止其他线程,就调用目标线程的 Thread.interrupt() 方法,线程池在退出时会自动给你调用这个方法,你只需要做好第一步判断中断就行了。想下 Thread.sleep()
Hito   
CountDownLatch
latch 设置 2 ,子线程中得到 true 时 latch.countDown()。主线程中 latch.await() 。
murenx   
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
public class SumCalculator {
private static final int TARGET = 1000; // 目标值,计算从 0 到目标值的累加和
private static final int THREAD_COUNT = 7; // 线程数量,用于并发计算
private static final AtomicBoolean finished = new AtomicBoolean(false); // 用于标记是否完成计算
private static volatile int result = 0; // 用于存储累加结果
public static void main(String[] args) {
CompletableFuture[] futures = new CompletableFuture[THREAD_COUNT]; // 创建 CompletableFuture 数组
for (int i = 0; i  { // 提交异步任务
int localSum = 0; // 用于存储局部累加结果
for (int j = 0; j  { // 当任意一个任务完成时
finished.set(true); // 标记计算完成
for (CompletableFuture future : futures) {
future.cancel(true); // 取消其他未完成的任务
}
});
try {
CompletableFuture.allOf(futures).join(); // 等待所有任务完成
} catch (Exception e) {
e.printStackTrace();
}
}
}
from kimi
git00ll   
向子线程发送中断,一般 IO 这种的都会抛中断异常。
如果没有堵塞代码你还需要增加 Thread.currentThread().isInterrupted()来判断当前中断标志位
您需要登录后才可以回帖 登录 | 立即注册

返回顶部