- - PR -
Timerクラスの使い方について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-14 22:48
ソケット本来のタイムアウト機能を使う方法は私も賛成しますが、他の方が書かれたとおりなので、私は Timer 周りにこだわってみます
あっ、と思って TimerTask#run() の説明を読んだところ、このメソッドは throws で投げて良い例外を規定していませんね。 ということは非検査例外しか投げられないので、MyTimeOutException extends RuntimeException としてください。 # 自分でコード書いて確認していなかったのがバレバレ やはり少し気になった点ですが、
Timer クラスの JavaDoc に書いてありますが、Timer オブジェクトを一つ作ると、対応して暗黙的にバックグラウンドスレッドが一つ動きます。 多重スレッドがそれぞれ Timer を使うと、スレッド負荷の軽重はありますが、スレッド数が倍になることにご注意ください。 (多重スレッドが一つの Timer を共有する実装も可能です。もしこちらの方法を採用済みでしたら、上記の記述は無視してください。) 最後にもう一つ、これも Timer が共有されていない場合の挙動の問題が考えられます。 url.openStream() が返ってこないと TimerTask#run() が実行され、run() が実行された後はバックグラウンドのタイマースレッドは無事終了します。 けれども、url.openStream() が速やかに返ってきた場合、check(String) が return true した後で run() が実行されて例外を投げるというトンチンカンな状態になるかもしれません。 用済みになった Timer の cancel() もお忘れなく (Timer が共有されている場合は TimerTask#cancel() です。) | ||||||||
|
投稿日時: 2005-06-15 02:47
あ,なるほど! RuntimeExceptionを拡張すれば良かったのですね。 ありがとうございます。
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(); } |