目前,我正在使用ThreadPoolExecutor API实现多处理。以下是处理的要求
ExecutorService executor = Executors.newFixedThreadPool(3);运行java进程。实际的RunnableTask如下所示
public class RunnableTask implements Runnable{
public void run(){
Process p=Runtime.exec("java -jar D:\ProcessIntiate.jar");
}现在,当池启动时,只有3个进程将并行启动。
我想一次只运行3个进程,在3个进程完成后,我的池必须等待30分钟,并且需要启动接下来的3个进程。当所有三个过程完成时,必须发出通知。
有使用ThreadExcutorFramwork的方法吗?
发布于 2017-01-28 08:51:39
一个简单的解决方案:只需为可运行的代码添加30分钟的等待时间。
或者更好:给可运行的参数一个参数来控制它等待的时间。对于前47个过程,您需要30分钟,然后是0。
或者,不要提交50个任务。相反:使用一个外部线程,该线程推送3个任务,然后等待/休眠,直到这3个任务完成。然后等30分钟,再推3分钟。
发布于 2017-02-17 13:21:19
与其直接将请求提交给线程池,不如将其存储在集合中。
使用大小为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还会返回未来的实例,这样您就可以控制提交的任务,并可以根据需要进行操作。
https://stackoverflow.com/questions/41907880
复制相似问题