在java中等待执行任务的线程池

Posted

技术标签:

【中文标题】在java中等待执行任务的线程池【英文标题】:Thread pool with wait for execution of task in java 【发布时间】:2019-10-08 18:16:03 【问题描述】:

我想在 java 中创建一个线程池代码,其中任务将等待任务中调用的函数完成。我经历了很多例子,但到目前为止还没有达到我的目标。

public class ThreadController 

    public static void main(String args[]) 
        ExecutorService service = Executors.newFixedThreadPool(5);

        List<String> list = new ArrayList<String>();
        list.add("john");
        list.add("reck");
        list.add("moni");
        list.add("sasha");
        list.add("pely");
        for (int p = 0; p < 100; p++) 
            for (int r = 0; r < 5; r++) 
                Task task = new Task(list.get(r));
                service.submit(task);
            
        
    


final class Task implements Runnable 

    private String taskSimNo;

    public Task(String no) 
        this.taskSimNo = no;
    

    public void run() 
        Initiate.startingInitiate(this.taskSimNo);
    

这个函数的完整思想是调用一个函数 processing() ,它是 mainMethod 类的一个方法。所以我想并行运行 10 个线程,但是,第 11 个任务应该只在 10 个任务中的任何一个完成执行时才开始,所以我需要实现等待功能让任务完成。请有任何建议。

【问题讨论】:

【参考方案1】:

你的带 task.wait() 的同步块除了阻塞循环之外什么都不做,因为在任何时候都没有调用 notify 方法。 所以你首先需要删除它。

其次,您的处理方法不会受益于任何多线程,因为它是在构造函数中调用的,并且对象创建是由主线程完成的。 解决方案是将您的处理方法向下移动到 run 方法中。

您正确地为线程池分配了一个限制,允许运行 10 个并发任务。

注意:订单不保证!例如,任务 11 可能在任务 8 之前运行。

【讨论】:

您好,我已根据您建议的更改更新了我的代码。如果还有什么需要更新的,请您重新检查一下。 您必须防止程序在线程池的工作人员完成任务之前终止。为此,您需要调用 ExecutorService#shutdown 和 ExecutorService#awaitTermination。该文档有一个很好的例子和解释:docs.oracle.com/javase/7/docs/api/java/util/concurrent/…

以上是关于在java中等待执行任务的线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池理解

Java线程池

Java如何判断线程池所有任务是不是执行完毕

《Java并发编程实战》----线程池的使用

Java 线程池的实现

Java 线程池