在我的程序中,我有一个n
项列表。
我将迭代列表并启动这样的过程:
Runtime.getRuntime.exec("cmd /C start abc.bat"+listitem() )
我需要保持4个进程的计数。完成任何一个过程后,我需要启动下一个过程,因此过程计数应为4。
我能够同时启动4个进程,但不确定如何保持4的计数。基本上我需要一个通知,一旦进程终止,所以我可以开始下一个,任何线程都是可能的。
关于如何实现这一点的任何帮助,有人可以分享上述要求的片段吗?
答案 0 :(得分:12)
使用大小为4的ThreadPoolExecutor
和启动Runnable
的{{1}}实施,然后调用Process
。由于线程池将限制为4个线程,并且所有4个线程将启动进程然后等待它,您将确定不会有超过4个子进程在运行。
一些示例代码可以帮助您:
Process.waitFor()
答案 1 :(得分:2)
public class ProcessRunner {
public static void main(String[] args) throws IOException, InterruptedException {
//Creating n threads as required
ExecutorService exec = Executors.newFixedThreadPool(4);
for(int i = 0; i < 4; i++){
exec.execute(new ProcessRunnable());
}
Thread.sleep(10000);
//whenever you want them to stop
exec.shutdownNow();
}
}
class ProcessRunnable implements Runnable{
@Override
public void run(){
do{
Process p;
try {
p = Runtime.getRuntime().exec("cd ..");
p.waitFor();
} catch (IOException e) {
//Take appropriate steps
e.printStackTrace();
} catch (InterruptedException e) {
//Take appropriate steps
e.printStackTrace();
}
}while(!Thread.interrupted());
}
}
处理#WAITFOR()
如果需要,导致当前线程等待,直到进程 由此Process对象表示已终止。此方法返回 如果子进程已经终止,则立即执行。如果 子进程尚未终止,调用线程将被阻塞 直到子进程退出。
答案 2 :(得分:1)
你应该有四个线程,每个线程从一个池中获取一个赋值,然后执行它,然后当它完成时,执行下一个赋值。这将是如何:
class Whatever extends Thread {
public void run() {
while (!interrupted()) {
String str = listitem();
if (str == null) // there are no more commands to run
break;
Runtime.getRuntime.exec(("cmd /C start abc.bat"+str).split("\\s")).waitFor();
}
然后启动其中四个线程。
答案 3 :(得分:1)
您可以使用大小为4的固定线程池,在任何给定时刻保证不超过4个活动线程
final ExecutorService ex = Executors.newFixedThreadPool(4);
for(int i = 0; i < 100; i++) {
ex.execute(new Runnable() {
@Override
public void run() {
... run the process here and wait for it to end
}
});
}