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();
    }
}
4

1 に答える 1

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();
于 2012-06-09T12:21:08.293 に答える