2015-11-02 309 views
-3

我想同時執行五次cmd命令。所以我創建了一個線程,它可以執行命令並啓動線程五次。它是否正確 ?同時啓動一個線程5次?

MyRunnable r1 = new MyRunnable(); 
     ExecutorService executor = Executors.newFixedThreadPool(5); 

     for (int i = 0; i < 5; i++) { 
      executor.execute(r1); 
     } 

.......

@Override 
    public void run() 
    { 
     try { 
      // Execute command 
      String command = "cmd /c start cmd.exe"; 
      Process child = Runtime.getRuntime().exec(command); 

      // Get output stream to write from it 
      OutputStream out = child.getOutputStream(); 

      out.write("cd C:/ /r/n".getBytes()); 
      out.flush(); 
      out.write("dir /r/n".getBytes()); 
      out.close(); 
     } catch (IOException e) 
     { 

     } 
    } 
+0

你的問題是什麼? – mvd

+0

我不相信。執行時間本身需要時間。如果我沒有錯,開始一個正常的線程需要約2秒 – Amirag

+0

那麼n次執行線程的正確方法是什麼? – seriously

回答

0

我不很明白,你的意思是烏德在你的問題的 「正確」 的東西。

如果您詢問,該代碼是否有效?那麼答案是肯定的。

這段代碼可能會導致一些問題嗎?那麼答案也是。

如果你的可運行對象有一些共同的狀態(一些類級別字段),它們可能會被破壞,因爲多個線程將能夠修改它。

如果您運行的是無狀態的,它的所有變量的方法範圍內聲明的,那麼一切都可以好起來,直到有一天有人會添加一個類級別的變量...而且可能會得到一個很奇怪的應用行爲,甚至更糟 - 一些生產錯誤,這將很難找到和調試。爲防止出現這種情況,您必須爲每個啓動的線程創建一個新的可運行類實例。

0

而不是使用,MyRunnable r1 = new MyRunnable(); 使用Runnable r1 = new MyRunnable();

要執行線程,我們可以使用execute()方法或submit()。 你的代碼對我來說很不錯。

確保ExecutorService已關閉。要關閉ExecutorService,可以使用shutdown()\ shutdownNow()。 另外可以使用awaitTermination()來等待所有線程終止。