1

ソケットを介して特定の TCP メッセージを送信するタスクを作成しました。一連のメッセージといくつかのタイムスタンプを含むファイルがあるので、タスクを TimerTask としてプログラムし、最初のメッセージのタイムスタンプを含むタイマーでスケジュールしました。

完了すると、タスクの実行メソッドは終了しますが、関連付けられたスレッドは残り、キャンセルされません。新しい時間でタスクを再スケジュールしようとすると、スケジュール済みまたはキャンセル済みのタスクを再スケジュールできないという例外が発生します。

また、再スケジュールする前にキャンセルしようとしましたが、明らかに、例外が言ったように、同じ問題のままです。

各メッセージには時間があり、一定ではないため、一定の周期でタスクをスケジュールして繰り返しさせることはできません。

TimerTask のスケジュールを変更するにはどうすればよいですか? ところで、ソケット通信のようにreadyメソッドでメッセージが来るまでブロックして、タスクの終了を待つ方法はありますか?

4

1 に答える 1

1

TimerTask は再スケジュールされるようには設計されておらず、(単一の) スレッドを管理するのは Timer です。

1 つの Timer多数の newTimerTaskを使用します。

各 Timer オブジェクトに対応するのは、タイマーのすべてのタスクを順番に実行するために使用される単一のバックグラウンド スレッドです。

Timer オブジェクトへの最後のライブ参照がなくなり、すべての未処理のタスクの実行が完了すると、タイマーのタスク実行スレッドは正常に終了する必要があります(ガベージ コレクションの対象になります)。

【各スケジュール方法より】

[the TimerTask] がすでにスケジュールされているかキャンセルされている場合、タイマーがキャンセルされた場合、またはタイマー スレッドが終了した場合は、IllegalStateException をスローします。

単一の Timer によって生成されたスレッドが実際に多数ある場合、それバグである可能性は低いです。実際に使用されている Timer オブジェクトが 1 つだけであることを確認してください。

個々のイベントをワークフローに組み込む方法に関する最後の質問は、別の投稿にする必要があります。

于 2013-01-17T17:14:51.273 に答える