nogの日記: jIRC: nioを使ってみる 4
日記 by
nog
jIRCの通信はSocketにたいしてBufferedReaderやWriter等のクラスを利用して通信していた。これだけのせいかはわからないが、起動しただけでは特に問題ないが、実際にサーバにつないだ場合、CPUの使用率がぐんぐんあがってふっ切れる。
(なんか説明悪いけど、勘弁して、、、)
そこで、nioを使用してみることにした。ノンブロッキングIOならポーリングしなくても大丈夫だと思った訳だが、重大なことに気がつく。ポーリングは入力と出力に対してそれぞれにスレッドを作成して行っていることを思い出した。出力のポーリングってもしかしてwaitとnotifyで減らせるんじゃないだろうか、、、
とりあえずnioのクラスで入出力するようにしたが、一行ずつの入力できるメソッドがない。結局入力はBufferReaderのクラスで行うことに。
動作はとりあえず良好。だけどこの前入れ替えたTextFieldが悪さしているのか、最大化から戻したとき等、チャンネルのTestAreaにスクロールバーが消える。なんかだめだめだこりゃ
Thread 周りは (スコア:1)
よくわかってないとはまりますよね。notify も wait されていない時は無視されるとか、InterruptedException の発生する個所とタイミングなどもよぉ~くわかってないとはまる。Thread.interrupted と Thread#isInterrupt とは挙動が違うなど。
結構たくさん Thread を立ち上げててもそれぞれの負荷が小さかったら無問題なはずなんですけど、動いていない Thread で無限ループとかで CPU を結構使ってたり。
ということで原因究明に JVM でプロファイリングしてみてはどうでしょう。
Re:Thread 周りは (スコア:1)
JVM以外だとHyperProfなど古いやつしか知らないのですが、Eclipseにはたくさん便利そうなのがあるんですね。(Eclipseは)sourceforge.jpにsshでcvsにつなごうとしているんですがなぜかうまくいかず、今もEmacsでがんばっています。これができると心置きなく移行できるんですけどねぇ。
TextField (スコア:0)
Macではどうなんだか知りませんが、SwingとAWTを混ぜて使うのは
けっこうはまるんで、やめておいたほうが無難ですよ。
他に手が無いから仕方ないのもわかるのですが・・・
Re:TextField (スコア:1)
だんだんAWTの方が好みになってきてたりしますけど ^-^;;