[英]What is the correct way to terminate thread on some condition?
一些線程在其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();
}
}
第一個解決方案是非常好的。 但是不是很干燥 ,請考慮在一些小的操作對象中包裝操作,並在執行每個操作之前檢查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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.