java for 循环或者while 里面使用线程池去执行代码,当都执行完成再往下执行

2023-12-07 13:26:44 浏览数 (2)

目录
  • 1 问题
  • 2 实现

1 问题

有一个for 循环,或者一个while 循环,里面的操作是调用其他的接口,如果不清楚需要调用多少次,反正互不影响,那么想要在这个里面使用线程池,并且这个while 里面的线程池里面的任务都执行完成之后,才会往下走,代码如何实现

2 实现

可以使用executor.isTerminated()方法来判断线程池是否已经终止(即所有任务都已完成)。该方法返回一个布尔值,如果线程池已经终止,则返回true;否则,返回false

在使用executor.execute()提交任务后,你可以在循环结束后使用executor.isTerminated()方法来等待线程池中的所有任务完成。具体步骤如下:

  1. 在循环结束后,调用线程池的shutdown()方法来关闭线程池。
  2. 使用executor.awaitTermination()方法等待线程池中的所有任务完成。该方法会阻塞主线程,直到线程池中的所有任务都执行完毕或者超过指定的等待时间。
  3. 在等待线程池任务完成后,可以使用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;
                    }
                }

0 人点赞