2

メイン メソッドで TimerTask を開始する Java クラスがあります。TimerTask を拡張するクラスは内部クラスです (クラス myTimer は TimerTask を拡張します)。その実行メソッドで myTimer は例外をスローします。メイン メソッドでは、次のように例外をキャッチしようとしています。

try {
  timer.schedule(new myTimer(arg1, arg2), 0, RETRY_PERIOD);
} catch (Exception e) {
     System.out.println("Exception caught");
}

しかし、これは機能しません。myTimer スレッドがスローする例外をキャッチすることはありません。それを行う方法はありますか?

4

2 に答える 2

2

あなたの状況は少しトリッキーで、コードスニペットで何が起こるかわかりません。タイマースレッドが例外をスローするまでメインスレッドがブロックされると思いますか?それは起こらないからです。実行する唯一のことは、スレッドによって定期的に実行されるコードではなく、try-catchへの呼び出しで発生する例外をキャッチすることです。schedule

とにかくそれは意味がありません。タイマースレッドはメインスレッドと並行して例外をスローする可能性があるため、例外をチェックするためにメインスレッドを定期的にフリーズするか、タイマーが終了するまでメインスレッドを永続的にフリーズする必要があります。

ScheduledThreadPoolExecutor後者の場合は、 :を使用して簡単に実行できます。

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
ScheduledFuture f = exec.scheduleWithFixedDelay(new Task(arg1, arg2), 0, 
                                   RETRY_PERIOD, TimeUnit.MILLISECONDS);

...
try {
    f.get(); // wait for task to finish
} catch(ExecutionException ex) {
    System.out.println("Exception caught");
}

ここで、Taskはを実装するクラスですRunnable

もちろん、これにより、タスクが例外を返すかスローするまでメインスレッドがブロックされます(これは決して発生しない可能性があります)。または、timed getを使用して、例外を定期的にチェックすることもできます。

于 2012-07-12T09:47:50.653 に答える
2

メソッドを追加したスレッドとはのスレッドでメソッドをTimer実行すると、親クラスのメイン メソッドはスローされた例外をキャッチできません。TimerTask.run()

考えられる解決策は、例外がメソッドの外に伝播するのを防ぎ、run()何らかのクエリ メソッドを介して親が有用な情報を利用できるようにすることです。run()親は、結果を照会する前に、メソッドが完了するのを待つ必要があります。

于 2012-07-12T08:59:21.257 に答える