Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中具有等待执行任务的线程池_Java_Multithreading_Thread Safety_Threadpool - Fatal编程技术网

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

java中具有等待执行任务的线程池,java,multithreading,thread-safety,threadpool,Java,Multithreading,Thread Safety,Threadpool,我想在java中创建一个线程池代码,其中task将等待直到task in中调用的函数完成。我已经经历了很多例子,但到目前为止还不能实现我的目标 public class ThreadController { public static void main(String args[]) { ExecutorService service = Executors.newFixedThreadPool(5); List<String> list

我想在java中创建一个线程池代码,其中task将等待直到task in中调用的函数完成。我已经经历了很多例子,但到目前为止还不能实现我的目标

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);
    }
}
公共类线程控制器{
公共静态void main(字符串参数[]){
ExecutorService=Executors.newFixedThreadPool(5);
列表=新的ArrayList();
列表。添加(“约翰”);
列表。添加(“记录”);
列表。添加(“moni”);
列表。添加(“萨沙”);
列表。添加(“贝利”);
对于(int p=0;p<100;p++){
对于(int r=0;r<5;r++){
任务任务=新任务(list.get(r));
服务提交(任务);
}
}
}
}
最后一个类任务实现Runnable{
私有字符串taskSimNo;
公共任务(字符串号){
this.taskSimNo=no;
}
公开募捐{
Initiate.startingInitiate(此.taskSimNo);
}
}

此函数的完整思想是调用函数processing(),它是mainMethod类的一个方法。所以我想并行运行10个线程,但是第11个任务应该只在10个任务中的任何一个完成执行时启动,所以我需要实现wait函数来让任务完成。请提供任何建议。

您与task.wait()的同步块只会阻塞循环,因为没有对notify方法的调用。 所以你首先需要去掉它

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

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


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

与Task.wait()同步的块只会阻塞循环,因为没有对notify方法的调用。 所以你首先需要去掉它

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

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


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

您好,我已经用您建议的更改更新了代码。如果还需要更新,请重新检查。您必须防止程序在线程池的工作人员完成任务之前终止。为此,您需要调用ExecutorService#shutdown和ExecutorService#Wait Termination。文档中有一个很好的例子和解释:您好,我已经用您建议的更改更新了我的代码。如果还需要更新,请重新检查。您必须防止程序在线程池的工作人员完成任务之前终止。为此,您需要调用ExecutorService#shutdown和ExecutorService#Wait Termination。文档中有一个很好的例子和说明: