目录
- 1 问题
- 2 实现
1 问题
有一个for 循环,或者一个while 循环,里面的操作是调用其他的接口,如果不清楚需要调用多少次,反正互不影响,那么想要在这个里面使用线程池,并且这个while 里面的线程池里面的任务都执行完成之后,才会往下走,代码如何实现
2 实现
可以使用executor.isTerminated()
方法来判断线程池是否已经终止(即所有任务都已完成)。该方法返回一个布尔值,如果线程池已经终止,则返回true
;否则,返回false
。
在使用executor.execute()
提交任务后,你可以在循环结束后使用executor.isTerminated()
方法来等待线程池中的所有任务完成。具体步骤如下:
- 在循环结束后,调用线程池的
shutdown()
方法来关闭线程池。 - 使用
executor.awaitTermination()
方法等待线程池中的所有任务完成。该方法会阻塞主线程,直到线程池中的所有任务都执行完毕或者超过指定的等待时间。 - 在等待线程池任务完成后,可以使用
executor.isTerminated()
方法检查线程池是否已经终止。
下面是一个示例代码:
代码语言:javascript复制import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
while (iterator.hasNext()) {
Object element = iterator.next();
Runnable task = new Runnable() {
@Override
public void run() {
// 调用其他方法进行画图逻辑
drawImage(element);
}
};
executor.execute(task);
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
if (executor.isTerminated()) {
// 所有任务已完成
// 继续执行后续逻辑
// ...
} else {
// 等待超时或被中断
// 处理未完成的任务
// ...
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void drawImage(Object element) {
// 画图逻辑
// ...
}
}
通过使用executor.isTerminated()
方法,你可以在等待线程池任务完成后进行进一步的处理,例如处理未完成的任务或执行其他操作。
我项目里面的使用方法
在for 循环里面先创建一个线程
代码语言:javascript复制 ThreadPoolExecutor executor = new ThreadPoolExecutor(
10,
ThreadAdminConfig.getAdminConfig().getThreadPoolFastMax(),
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1000),
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "fastTriggerPool-" r.hashCode());
}
});
代码语言:javascript复制 //ExecutorService executor = Executors.newFixedThreadPool(320);
// 创建一个标志位,用于判断是否所有线程都完成
boolean allThreadsComplete = false;
executor.execute(new Runnable() {
@Override
public void run() {
// 得到的start 和 end 就是 预报时间的下标
// 根据时间下标 去读取出数据
double[][] startresult = read(finalStart, itemm.getLatNum(), itemm.getLonNum(), datPath);
double[][] endresult = read(finalEnd1, itemm.getLatNum(), itemm.getLonNum(), datPath);
// 结束的 减去 开始的
double[][] reduce = reduce(startresult, endresult);
mergeArrayToPngs(reduce, itemm, finalEnd, 999D,timeindex);
System.out.println("画图成功");
System.out.println(finalUi);
//
}
});
在for 之外
代码语言:javascript复制 // 关闭线程池,不再接受新的任务提交
executor.shutdown();
System.out.println("关闭线程池");
// 等待所有线程完成
while (!allThreadsComplete) {
if (executor.isTerminated()) {
allThreadsComplete = true;
}
}