首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程执行程序:在启动下一个进程之前运行多个进程和池等待30分钟。

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

Stack Overflow用户
提问于 2017-01-28 08:42:23
回答 2查看 1.1K关注 0票数 1

目前,我正在使用ThreadPoolExecutor API实现多处理。以下是处理的要求

  1. 定义为否。使用ThreadPool一次使用ExecutorService executor = Executors.newFixedThreadPool(3);运行java进程。
  2. 我将所有可运行的jar进程的实际进程提交给池。 (int i=1;i<50;i++) { RunnableTask r=new RunnableTask();executor.submit(r);}

实际的RunnableTask如下所示

代码语言:javascript
复制
public class RunnableTask implements Runnable{
  public void run(){
  Process p=Runtime.exec("java -jar D:\ProcessIntiate.jar");
}

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

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

有使用ThreadExcutorFramwork的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2017-01-28 08:51:39

一个简单的解决方案:只需为可运行的代码添加30分钟的等待时间。

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-02-17 13:21:19

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

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

它将在批处理中从集合中获取任务,并将其提交到另一个池中,在该池中,它实际上被编程来处理提交的任务。

代码语言:javascript
复制
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还会返回未来的实例,这样您就可以控制提交的任务,并可以根据需要进行操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41907880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档