2012-06-09 64 views
4

某些線程在其run方法中執行一系列操作。當站關閉時,通過onStationClosed通知所有乘客。發生時,線程必須執行一些操作(例如,LeaveStation),並且線程必須終止,而不必完成所有剩餘操作。在某些情況下終止線程的正確方法是什麼?

什麼是正確的方式做到這一點:

// 1 - By checking station's state between each operationN? 

public class Passenger extends Thread 
{ 
    Station station; 
    public void onStationClosed() 
    { 
      // Do some action before thread terminates 
    } 
    @Override 
    public void run() 
    { 
     operation1(); 
     if(station.getState == Station.Closed) return; 
     operation2(); 
     if(station.getState == Station.Closed) return; 
     operation3(); 
     if(station.getState == Station.Closed) return; 
     .. 
     operationN(); 
    } 
} 

// 2 - Throw StationClosedException from onStationClosed and catch it in Station. 

public class Passenger extends Thread 
{ 
    Station station; 
    public void onStationClosed() 
    { 
     // Do some action before thread terminates 
     throw new StationClosedException(); 
    } 
    @Override 
    public void run() 
    { 
     operation1(); 
     operation2(); 
     .. 
     operationN(); 
    } 
} 
+0

如何創建某種類型的堆棧來保存操作(這需要是一個具有operation()方法的接口),然後在while循環中迭代,但在循環開始時檢查站狀態? –

+2

對控制流使用異常總是不好,異常只能用於異常。我認爲第一個很有趣,但仍然不理想。你能解釋一下你的問題嗎?你爲什麼需要線程?爲什麼你不能使用回傳信號向工作人員發出信號,說明當一個電臺關閉時不應再做任何工作? –

+0

我有車站和乘客。乘客去車站並嘗試進入車站。乘客在車站做他們需要的東西,一旦車站關閉,即使他們沒有完成他們計劃做的所有事情,他們也需要離開。 – theateist

回答

2

第一個解決方案是相當不錯的。但是不是很,可以考慮在一些小的操作對象包裝操作和執行每次操作前檢查station狀態:

List<Operation> operations = Arrays.asList(new Operation1(), new Operation2(), new Operation3()); 

for(Operation operation: operations) { 
    if(!perform(operation)) { 
    return; 
    } 
} 

perform()定義如下:

private boolean perform(Operation operation) { 
    if(station.getState == Station.Closed) 
    return false; 
    operation.run(); 
    return true; 
} 

一點點牽強,但是當操作數量增加時,您會欣賞它。

我不太瞭解例外解決方案。如果從onStationClosed()回調中拋出該異常,它將被拋回到您的事件發件人線程,而不是Passenger線程。它不會中斷你的線程。

但是,您可以使用InterruptedException來控制此流程。該解決方案與檢查站狀態非常相似,但是您檢查標記Thread.isInterrupted()。增加的好處:I/O操作和睡眠會自動中斷。你所要做的就是呼叫

Thread passenger = new Passenger(); 
passenger.interrupt(); 
Thread passenger = new Passenger(); 
passenger.interrupt(); 
+1

使用'InterruptedException'是要走的路,因爲只要添加I/O,您就需要抓住這些。 – user949300

+1

只需要注意,您需要在Station上同步,因爲您正在一個線程中更新它的狀態並在另一個線程中使用它。 – Ravi

相關問題