8

私は同時実行とスレッドに不慣れで、仕事でアプリケーションを開発するときにそれらを使用しています。基本的に、ファイルの変更をポーリングする RMI アプリケーション (サーバー側コンポーネント) に多数のスレッドがあります (これらのファイルは数秒ごとに更新されます)。

開発ボックスでテストするとき、コマンドラインからサーバーを実行し、終了したら手動で閉じて、すすぎ、一日中繰り返しました。

それが発生すると、コマンドラインを閉じても処理を続行しても、スレッドが停止しない可能性があると思います。これはいくつかの非常に悪い副作用につながります - これが可能かどうかは 100% 確信が持てませんが、誰かがこれが事実である可能性があることを確認できることを願っています.

スレッドをデーモンにすると、コマンド ラインを閉じると、これらのスレッドは自動的に停止するということですか? アプリケーションを適切に終了する方法が必要ですが、サーバーは最終的に autosys によって実行されるため、シャットダウン時にすべてのスレッドを終了させる最善の方法がわかりません

ありがとう

4

3 に答える 3

1

次のコードは、実行中のダミー タスクを使用してスレッド プールを作成する方法を示しています。その後、そのタスクが開始され、アプリケーションが終了すると、実行中のすべてのタスクをキャンセルしてスレッド プールを完全に閉じるシャットダウン フックが実行されます。

私が持っているように、Callable を使用する必要はありません。Runnables と threadPool.execute メソッドを使用して、少し洗練されていない threadPool を単純に終了できます。

    final ExecutorService threadPool = Executors.newCachedThreadPool();
    final List<Future<Void>> runningTasks = new ArrayList<>();
    Future<Void> task = threadPool.submit(new Callable<Void>() {

        @Override
        public Void call() throws Exception {
            int count = 0;
            while(true) {
                System.out.println(++count);
                Thread.sleep(1000);
            }
        }
    });
    runningTasks.add(task);

    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run() {
            for(Future<Void> runningTask : runningTasks) {
                runningTask.cancel(true);
            }
            threadPool.shutdownNow();
        }
    });

シャットダウン フックは、スタンドアロン アプリケーション用です。Java EE コンテナーでは、javax.servlet.ServletContextListener を使用して同じことができます。

于 2013-03-17T17:32:17.217 に答える
1

スレッドは Java 仮想マシン内で実行されます。JVM を停止すると、スレッドは実行されなくなります。JVM を終了することは、コンピューターからプラグを抜くことと見なすことができます。何も実行できなくなります。

于 2013-03-17T17:32:29.793 に答える
0

RMIランタイムは、停止できないスレッドを作成します。サービスをシャットダウンする唯一の方法は、System.exit()を使用することです。

これは別のスレッドで行います。new ShutThread()。start()の後、シャットダウンされたスレッドは2秒間待機して、長引くメッセージにジャーニーを完了する機会を与えてから、System.exit()を発行します。

于 2013-03-17T17:40:29.953 に答える