2011-08-24 101 views
2

我有一個Runnable實現類將運行從Executors.newFixedThreadPoolRunnable內,我有一個無限循環運行,它監聽UDP端口上的傳入數據。停止無限循環從ThreadPool運行Runnable運行

我想優雅地結束Runnable爲了關閉所述UDP端口。

我該如何做到這一點? 當直接擴展Thread時,我可以訪問interrupt()和isInterupted()等,我可以基於此無限循環。

Runnable實現類然而,我想要做這樣的事情

@Override 
public void run() { 
    while (active) { 

    } 
} 

,並有

private boolean active = true; 

如何設置激活=當線程池被終止假的?

+0

你的線程池中只有這種Runnable? –

+0

是的。還有什麼其他類型的RUnnable? – chzbrgla

+0

哈哈! Sry,我的英語很差..無論如何,我想知道你提交給你游泳池的所有物體是否是同一個班級。或者實現一個通用接口(Runnable除外)。 –

回答

8

您可以使用靜態方法Thread.interrupted()(例如,)來訪問當前線程的中斷標誌。而不是你active標誌的使用:

public void run() { 
    try { 
     // open your ports 
     while (!Thread.interrupted()) { 
      // do stuff 
     } 
    } finally { 
     // close your ports in finally-block 
     // so they get closed even on exceptions 
    } 
} 

而當你想關閉您的ExecutorService,調用它shutdownNow()。這將interrupt()任何正在運行的工作線程並讓您的Runnable突破其循環。

1

您可以使用此

while (!executor.isShutdown) { 
//do your job 
} 

或while循環使用AtomicBoolean。 (最好超過volatile

該標誌可以,如果你想停止手動處理,如stopProcessing()

+0

所以我需要保持對執行者的引用。 以及當我關閉執行程序時發生了什麼?它是否等待內部所有線程的終止?如果不是,執行者可能會終止並且(!executor.isShutdown)將不會被達到? – chzbrgla

+0

是的,你需要一個參考。如果你使用'executor.shutdown',javadoc就會這樣說:「啓動一個有序的關閉,在其中執行先前提交的任務,但不會接受任何新任務。」在內部,這會中斷所有的空閒線程。所以我想這會等待所有線程的終止。 –

2

如果你得到一個未來,當你提交你可以cancel(boolean)未來的任務,如果你通過設置一些方法真正的任務正在運行的線程將被中斷

@Override 
public void run() { 
    try{ 
     while (!Thread.interrupted()) { 


      if(Thread.interrupted())return;//to quit from the middle of the loop 
     } 
    }finally{ 
     //cleanup 
    } 
} 

請注意,您必須將中斷標誌與Thread.currentThread().interrupt();重置每次你得到一個拋出InterruptedException的

1

我建議不要使用'Runnable',而是覆蓋'FutureTask'並實現它'完成'和'取消'(如果需要)的方法 - 在那裏你可以做所有必要的清理操作。

編輯:

忘了`取消'的方法。