目前,我正致力于使用ThreadPoolExecutor
API实现多处理。以下是处理
ExecutorService executor = Executors.newFixedThreadPool(3);
我正在将所有可运行jar进程的实际进程提交到池
for(int i=1; i<50; i++) {
RunnableTask r=new RunnableTask();
executor.submit(r);
}
以及实际的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?
答案 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也会返回将来的实例,这样您就可以控制提交的任务,并可以根据需要进行操作。