- PR -

Timerクラスの使い方について

投稿者投稿内容
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-06-14 22:48
ソケット本来のタイムアウト機能を使う方法は私も賛成しますが、他の方が書かれたとおりなので、私は Timer 周りにこだわってみます

引用:

もしかして,TimerTask#run()は明示的に例外をスローできない??



あっ、と思って TimerTask#run() の説明を読んだところ、このメソッドは throws で投げて良い例外を規定していませんね。
ということは非検査例外しか投げられないので、MyTimeOutException extends RuntimeException としてください。

# 自分でコード書いて確認していなかったのがバレバレ

やはり少し気になった点ですが、

引用:

サーバに接続する部分についてはThreadを使って多重化しています。



Timer クラスの JavaDoc に書いてありますが、Timer オブジェクトを一つ作ると、対応して暗黙的にバックグラウンドスレッドが一つ動きます。
多重スレッドがそれぞれ Timer を使うと、スレッド負荷の軽重はありますが、スレッド数が倍になることにご注意ください。
(多重スレッドが一つの Timer を共有する実装も可能です。もしこちらの方法を採用済みでしたら、上記の記述は無視してください。)

最後にもう一つ、これも Timer が共有されていない場合の挙動の問題が考えられます。
url.openStream() が返ってこないと TimerTask#run() が実行され、run() が実行された後はバックグラウンドのタイマースレッドは無事終了します。
けれども、url.openStream() が速やかに返ってきた場合、check(String) が return true した後で run() が実行されて例外を投げるというトンチンカンな状態になるかもしれません。
用済みになった Timer の cancel() もお忘れなく
(Timer が共有されている場合は TimerTask#cancel() です。)
唐竹
会議室デビュー日: 2005/05/03
投稿数: 14
投稿日時: 2005-06-15 02:47
引用:

Gioさんの書き込み (2005-06-14 22:48) より:
ということは非検査例外しか投げられないので、MyTimeOutException extends RuntimeException としてください。


あ,なるほど! RuntimeExceptionを拡張すれば良かったのですね。
ありがとうございます。

引用:

Timer クラスの JavaDoc に書いてありますが、Timer オブジェクトを一つ作ると、対応して暗黙的にバックグラウンドスレッドが一つ動きます。

最後にもう一つ、これも Timer が共有されていない場合の挙動の問題が考えられます。


Timerクラスのパフォーマンスについては,とりあえずプログラムが動くようになってから考えようと思っていました。
ご指摘に通りに,Timerを共有するようにしようと思います。

それから,ソケットを使ったタイムアウトについても何とか解を出すことができました。
以下のソースで,3秒後にタイムアウトを実現できています。
思ったより短めのコードで済みました。

みなさま,ありがとうございました!

String sUrl;
sUrl = "http://reikisv.general.hokudai.ac.jp/reiki/reiki.html";
try {
URL url = new URL(sUrl);
int port;
if(-1 == url.getPort()){
port = url.getDefaultPort();
} else {
port = url.getPort();
}
InetSocketAddress address = new InetSocketAddress(url.getHost(), port);
Socket socket = new Socket();
socket.connect(address, 3000);

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

スキルアップ/キャリアアップ(JOB@IT)