2012-01-16 19 views
-2

サーブレットを作成中です。サーブレットは、init()のスレッドを開始し、サーバーが停止した後に正しく停止する必要があります。スレッドはWebページをダウンロードし、解析し、MySQLデータベースにデータを保存します。システムのスレッドを見つけるにはどうしたらいいですか?

私はサーブレットのdestroy()メソッドを使用してスレッドを停止します。このメソッドでは、スレッドを終了する条件を設定します。これは正しい方法ですか?

Windowsのどこかにスレッドの存在の兆候が見えますか?私はWindowsタスクマネージャーでそれを見つけられませんでした。

答えて

3

Windowsタスクマネージャは、個々のスレッドではなく、プロセスのみを表示します。実際、JVM管理のスレッドは、ユーザースレッドのカテゴリに分類されます。ユーザースレッドは、オペレーティングシステムによって管理されるカーネルスレッドとは別のカテゴリです。

Threadオブジェクトへのグローバル参照を保持する必要があるため、さまざまな方法で表示されるようにします。 Thread.stop()のようなものを使用する代わりに、フラグを設定してスレッドをフラグにスピンさせて停止させることも望ましいです。このようなもの:

class ThreadTask implements Runnable { 
    private volatile boolean flag = false; 

    public void setFlag(boolean value) { 
     flag = value; 
    } 

    public void run() { 
     while(!flag) { 
      // execute code 
     } 
    } 
} 

setFlag(true)を呼び出して停止します。

+0

+1と表示されます。多くの場合、 'Thread.interrupt()'とファミリは_ad hoc_ volatileブールフラグよりも優れていることに注意してください。スレッド中断はブロッキングメソッド(例外はほとんどありません)にあっても簡単にスレッドをシャットダウンできるためです。また、 'Executors'や' Future'sのような既存の標準的な並行処理ユーティリティーもうまくいきます。 –

+0

私はそうしましたが、揮発性と機能なしのsetFlagを忘れました。サーブレットのフィールドとして宣言されたフラグ。 – savva

+0

@savva:そうですか? – Tudor

2

いいえ、Windowsでは表示できません。スレッドは表示されず、プロセスが表示されます。スレッドはjvmプロセスの内部にあります。

visualvm(JDK/bin/jvisualvmにも含まれています)のスレッドが表示されます。ちょうどあなたのtomcatに接続し、スレッドを参照してください。

destroy()の方法が適しています。しかしthread.interrupt()に電話してください。

より良いアプローチは、Java 5 executors frameworkを使用することです。あなたはエグゼキュータを作成し、それにRunnableを提出します。 destroy()に電話すると、executor.shutdown()

+0

申し訳ありません。このメソッドでフラグのみを設定すると、destroyは割り込みを呼び出すのはなぜですか? – savva

+0

スレッドは永遠に実行されないでください。実際には、Tomcatはとにかくそれを中断しますが、警告が表示されます – Bozho

関連する問題