我正在寫一個小程序,它使用PsExec.exe
從使用ProcessBuilder
啓動的cmd啓動,在聯網的PC上覆制和安裝應用程序(需要安裝的PC數量可以從5到50)。在Java程序中實現多線程
如果我爲每臺PC依次啓動ProcessBuilder
,程序會正常工作。
然而,爲了加快速度,我想實現某種形式的多線程這可能讓我安裝5 PC當時的同時(直到所有的PC已經安裝了5×Processbuilder
過程中的一個「批量」)。
我想組合使用一個固定的線程池與可呼叫接口的(的PsExec
每個執行返回一個值,該值指示如果執行爲succesfull並且我不得不評估)。
用於ProcessBuilder
的代碼是:
// Start iterating over all PC in the list:
for(String pc : pcList)
{
counter++;
logger.info("Starting the installation of remote pc: " + pc);
updateMessage("Starting the installation of remote pc: " + pc);
int exitVal = 99;
logger.debug("Exit Value set to 99");
try
{
ProcessBuilder pB = new ProcessBuilder();
pB.command("cmd", "/c",
"\""+psExecPath+"\"" + " \\\\" + pc + userName + userPassword + " -c" + " -f" + " -h" + " -n 60 " +
"\""+forumViewerPath+"\"" + " -q "+ forumAddress + remotePath + "-overwrite");
logger.debug(pB.command().toString());
pB.redirectError();
Process p = pB.start();
InputStream stErr = p.getErrorStream();
InputStreamReader esr = new InputStreamReader(stErr);
BufferedReader bre = new BufferedReader(esr);
String line = null;
line = bre.readLine();
while (line != null)
{
if(!line.equals(""))
logger.info(line);
line = bre.readLine();
}
exitVal = p.waitFor();
} catch (IOException ex)
{
logger.info("Exception occurred during installation of PC: \n"+pc+"\n "+ ex);
notInstalledPc.add(pc);
}
if(exitVal != 0)
{
notInstalledPc.add(pc);
ret = exitVal;
updateMessage("");
updateMessage("The remote pc: " + pc + " was not installed");
logger.info("The remote pc: " + pc + " was not installed. The error message returned was: \n"+getError(exitVal) + "\nProcess exit code was: " + exitVal);
}
else
{
updateMessage("");
updateMessage("The remote pc: " + pc + " was succesfully installed");
logger.info("The remote pc: " + pc + " was succesfully installed");
}
現在我讀過關於如何實現可調用的一些信息,我想附上我的ProcessBuilder
在Callable接口,然後提交所有在for循環中運行的任務。
我在正確的軌道上嗎?
太棒了,這正是我心中所想的,做得很好!至於你的問題: 1:當你創建一個大小爲5的固定線程池時,無論你有沒有將5個任務放到池中,都會啓動5個線程。如果超過5個,他們只需等待,如你所說。 2:invokeAll只是一個建議,有更多的控制權。與submit不同,invokeAll阻塞,直到所有任務完成。這是因爲你似乎有這麼幾項任務,但如果你有更多的任務,你應該考慮使用提交或invokeAll的時間約束變體來處理結果。 – PNS
Hy我還有一個問題,如果我希望在每個線程完成後立即獲得一個結果,而不等待池中的所有線程完成,那麼實現此目標的最佳方法是什麼?我可以告訴每個線程在完成後立即通知我結果嗎?謝謝 –