チャット アプリケーションの新しいメッセージをロング ポーリングするために、Timer と TimerTask を使用しています。「わずかに」異なる 2 つの可能性を検討したいと思います。
1 :ローカル変数として宣言されたタイマー
public List<MessageBean> getLastMessages(...) {
[...]
Timer timer = new Timer(true); //**Timer declared as local variable**
while (someCondiction) {
MessagesTimerTask returnMessagesTask = new MessagesTimerTask([...]);
timer.schedule(returnMessagesTask, 6000);
synchronized (listMessageBean) {
listMessageBean.wait();
//notify is called in the MessagesTimerTask which extends TimerTask
}
}
}
*問題:メソッドを呼び出すたびに、[Timer-1]、[Timer-2] などの新しいスレッドが作成されていることがわかります。Eclipse のデバッグ ウィンドウでは、getLastMessagesの後でもすべて実行されているように見えます。 (..)実行を終了し、クライアントに値を返します。タイマーが実際にスレッドを使用している場合、これは大きな問題を引き起こす可能性があり、いくつかのトランザクションの後、サーバーは最終的にすべてのマシン リソースを消費します。
2 :ローカル フィールドとして宣言されたタイマー
private final Timer timer = new Timer(true); //**Timer declared as local field**
public List<MessageBean> getLastMessages(...) {
[...]
while (someCondiction) {
MessagesTimerTask returnMessagesTask = new MessagesTimerTask([...]);
timer.schedule(returnMessagesTask, 6000);
synchronized (listMessageBean) {
listMessageBean.wait();
//notify is called in the MessagesTimerTask which extends TimerTask
}
}
}
*問題:メソッドを呼び出すたびに同じスレッドが使用される [Thread-1] が、2 つの連続した呼び出しを行うかどうかわからない場合、後者は前者をキャンセル/オーバーライドします (クラスは @Autowired by spring です) ) ?
助言がありますか ?ありがとうございました。