11

アプリがサーバーを介して読み込まれるときにインスタンス化する MyThread オブジェクトがあり、それをデーモン スレッドとしてマークしてから呼び出しますstart()。スレッドは、アプリケーションがアクティブである限り、キューからの情報を待ちます。私の問題/質問は次のとおりです。現在、MyThread は Thread を Daemon としてマークしているため、Thread を拡張しています。だから私が尋ねたかったのは、MyThread が Thread を拡張する代わりに Runnable を実装するかどうか (そしてもちろん名前が変更されるかどうか) でありnewSingleThreadScheduledExecutor()、どのように、何を、またはどこで、何かを Daemon としてマークするかを使用します。マルチスレッド環境のいくつかの部分は私にとって非常に新しいものであるため、用語を混乱させていないことを願っています。

ありがとう

更新: 私のアプリで参照しているモジュールは、実際にはこの種のスレッドがいくつかある Web アプリであり、それらに共通しているのは、ServletContextさまざまな理由ですべてがメンバーとして含まれていることです。現在、私はこれを memebr として拡張ThreadWebThreadており、ServletContextすべてのサブクラスがこれを利用できます。Executor と ThreadFactory を使用して Runnable パラダイムに切り替える場合、基本的には、WebRunnable実装RunnableとをServletContextパブリック メンバーとして持つ醜いハイブリッドが必要であり、ThreadFactory実装newThread(WebRunnable arg0)に加えて実装が必要newThread(Runnable arg0)です。何が一番いいのかわからない。ありがとう

4

3 に答える 3

12

スケジュールされたエグゼキュータを使用している場合は、ThreadFactoryを提供できます。これは新しいスレッドを作成するために使用され、必要に応じてこれらを変更できます (たとえば、デーモンにする)。

編集:あなたの更新に答えるにThreadFactorynewThread(Runnable r)、あなたWebRunnable Runnable. したがって、実際の余分な作業はありません。

于 2009-10-04T11:21:39.970 に答える
2

完全を期すために、別の可能な解決策で補完するだけです。それほど素敵ではないかもしれませんが。

final Executor executor = Executors.newSingleThreadExecutor();
Runtime.getRuntime().addShutdownHook(new Thread() {

    @Override
    public void run() {
        executor.shutdownNow();
    }
});
于 2012-02-09T16:06:08.163 に答える