某个线程在其run
方法中执行一系列操作。当车站关闭时,它通过onStationClosed
通知所有乘客。当它发生时,线程必须做一些动作(例如,离开站点)并且线程必须终止而不完成所有剩余操作。
这样做的正确方法是什么:
// 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 :(得分:2)
第一种解决方案非常好。但是不是很dry,考虑在一些小动作对象中包装操作并在执行每个操作之前检查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();