线程执行程序:在启动下一个进程之前运行多个进程和池等待30分钟

时间:2017-01-28 08:42:23

标签: java multithreading executorservice java.util.concurrent threadpoolexecutor

目前,我正致力于使用ThreadPoolExecutor API实现多处理。以下是处理

的要求
  1. 定义否。使用ExecutorService executor = Executors.newFixedThreadPool(3);
  2. 使用ThreadPool一次运行的java进程
  3. 我正在将所有可运行jar进程的实际进程提交到池

    for(int i=1; i<50; i++) {
      RunnableTask r=new RunnableTask();
      executor.submit(r);
    }
    
  4. 以及实际的RunnableTask如下

    public class RunnableTask implements Runnable{
      public void run(){
      Process p=Runtime.exec("java -jar D:\ProcessIntiate.jar");
    }
    

    现在,当池启动时,只有3个进程将并行启动。

    我想一次只运行3个进程,在完成3个进程后,我的池必须等待30分钟,然后需要启动接下来的3个进程。当所有3个过程完成时,必须要求通知。

    有没有办法使用ThreadExcutorFramwork?

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案:只需在Runnable代码中添加30分钟的等待。

或更好:给runable一个参数来控制它等待的时间。 对于前47个过程,您需要30分钟;然后是0。

或者只是不提交50个任务。 相反:使用外部线程推送3个任务,然后等待/休眠,直到完成3个任务。然后等30分钟再推3。

答案 1 :(得分:0)

不是直接将请求提交给线程池,而是将其存储在集合中。

使用大小为1的ScheduledExecutorService来安排将在指定的时间间隔后运行的任务(例如,在您的情况下为30分钟)。

它将从批处理中收集任务,并将其提交到另一个池,在该池中实际编程以处理提交的任务。

class CustomScheduledExecutor  {
ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(1);
ExecutorService executorService = Executors.newFixedThreadPool(3);

Queue<Runnable> queue = new ConcurrentLinkedQueue<Runnable>();

public CustomScheduledExecutor(){
    scheduleExecutor.scheduleWithFixedDelay(new Runnable() {

        @Override
        public void run() {
            for(int i=0;i<3;i++){
                Runnable poll = queue.poll(); // Do the handling for queue size
                executorService.submit(poll);
            }
        }
    }, 1000, 30, TimeUnit.MINUTES);
}

public void submitTask(Runnable runnable){
    queue.offer(runnable);
}

}

submit也会返回将来的实例,这样您就可以控制提交的任务,并可以根据需要进行操作。