2012-10-31 43 views
0

因此,假設我在for循環中創建並啓動了一堆線程,該線程正在啓​​動程序線程的run方法中執行。我們還要說,我希望能夠中斷啓動程序線程和線程創建的所有線程,並且我通過一個按鈕來完成。另一個正在運行時禁止一個任務

因此,像這樣 -

try{ 
      for(int i = 0; i < n;i++){ 

       Worker currThread = new Worker(someArgs); 
       workerThreads.add(currThread); 
       currThread.start(); 
      } 
     } catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 

按鈕 -

public void actionPerformed(ActionEvent arg0) { 

    List<Worker> threads = launchThread.getWorkerThreads(); 
     for(int i = 0; i < threads.size();i++){ 
      threads.get(i).interrupt(); 
     } 
     launchThread.interrupt(); 

    } 

現在,讓我們說,我想,這樣的中斷可以在同一時間線程創建不發生做出來。我想辦法做到這將是構建一個虛擬對象,並把代碼兩片鎖

synchronized(dummyObject){ 
//thread creation or interruption code here (shown above) 
} 
請問這樣的工作

裏面?我問,因爲我不知道如何測試,看看會不會。

+1

如果你的線程沒有被編程來檢查中斷標誌,調用'interrupt'將不會執行任何操作。也許唯一的影響是可見的,如果你的線程在等待或阻塞狀態。但是,如果他們處於跑步狀態,他們不會停下來,除非他們被編程。 –

回答

1

單獨啓動線程並創建它們。

for(int i = 0; i < n; i++) { 
    Worker currThread = new Worker(someArgs); 
    workerThreads.add(currThread); 
} 

// later 
for (Worker w : workerThreads) { 
    w.start(); 
} 

如果這還不夠,你dummyObject同步應該只是罰款。

// You probably need to make this a (private final) field 
Object lock = new Object(); 

// later 
synchronized (lock) { 
    for(int i = 0; i < n; i++) { 
     Worker currThread = new Worker(someArgs); 
     workerThreads.add(currThread); 
     w.start(); 
    } 
} 

// later still 
public void actionPerformed(ActionEvent arg0) { 
    synchronized (lock) { 
     // interruption code here 
    } 
} 
+0

等待,如果我是鈍的,但我不明白如何解決這個問題 - 線程創建後和線程啓動之前無法按停止按鈕? – praks5432

+0

@ praks5432是的,但線程將不會在該點運行,因此[沒有效果](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html #中斷%28%29)。 –

0

同步的概念保持不變但是複雜的是要執行的底層操作。

如您所述,有兩種類型的互斥任務(線程創建和中斷)。所以鎖定幾乎是該工作的規範工具。

相關問題