ScheduledExecutorService の謎
土曜日, 1 月 10th, 2009年末に ScheduledExecutorService を利用した単純なカウントダウンプログラムを作った。
普通のスレッドで Thread.sleep(1000); とかするのと違いはあるのか気になった。
そこで NetBeans のプロファイラを利用して違いを確認してみました。
ScheduledExecutorService を利用したほうはこのまえと同じです。
ただし、更新時間を変更してあります。
int procs = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
ScheduledExecutorService ses = Executors.newScheduledThreadPool(procs);
ses.scheduleAtFixedRate(new task(), 0, 5, TimeUnit.MILLISECONDS);
普通のスレッドで一定時間眠らせて更新をするほうは
try {
Thread.sleep(5);
} catch (InterruptedException ex) {
Logger.getLogger(countdown.class.getName()).log(Level.SEVERE, null, ex);
}
としました。
気になる結果は
ScheduledExecutorService
Thread
以上のような結果となりプログラムの実行結果としては同じですがずいぶん違いがあるのが確認できました。
ScheduledExecutorService はスレッドが休眠なしで100パーセント実行されてます。
対して普通のスレッドは Thread を眠らせて更新を繰り返すのでそうではありません。
下段の真ん中のグラフも面白い結果をしめしてますね。
NetBeans のプロファイラを使うとこういったプログラムの動作を視覚的に確認できます。(^^)
本当に Cool なツールですね!
ここで問題なのですが・・・ こういった定期的に処理を行うプログラムを作るときどちらを使うべきなのか?
私はプロではなく趣味で Java を楽しんでる未熟者なのでそれぞれのメリットやデメリットが今ひとつ解りません。
ScheduledExecutorService はあとから追加されたものなので Thread よりもいいのかな?と思ったりしてます。
Memo
NetBeans でプロファイラを使用するにはプロファイリングするプロジェクトを右クリックします。
そして[ プロファイル ] をクリック
[ <プロジェクト名>のプロファイル ] というウィンドウが出ますのでプロファイルする項目を左のボタンで選んで実行します。
初回にプロファイラの調整が実行されますので注意事項を読んで調整を実行します。
今回は [ 監視 ] を選んで [ スレッドの監視を有効化 ] にチェックを入れて [ 実行 ] ボタンを押し、スレッドを監視しました。