私はメインスレッドからスレッドを実行したい、しかし、メインスレッドが終了した後にこのスレッドを実行したい。 どうすればいいですか? スレッドにメインスレッドへの参照を渡し、join()メソッドを呼び出すことはできますか?メインスレッドの終了後にどのスレッドが確実に実行されるようにするには?
答えて
最も近いshutdownHook
、
Runtime.getRuntime().addShutdownHook(new Thread(){
...
});
だろう。しかし、これは実行しますが、プロセスは、プロセスは、死ぬことのthatsたら、あなたは「doesnのプロセスに任意のスレッドを追加することはできません、まだ生きているだろうもう存在しない。
これにはRuntime.getRuntime()
メソッドを使用できます。私はシャットダウン・フックの代わりに他の回答を使用することをお勧めしますが、あなたは次のように、人為的、基本的なスレッドオブジェクトでこれを行うことができますdocumentation
でこれについての詳細を見つけることができ
public static void main(String[] args) {
.....
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
public void run(){
// run when the main thread finishes.
}
}));
}
:ここでは一例であり、 。
public static void main(String[] args) throws Exception {
// parametrizes with current thread
new Deferrable(Thread.currentThread());
System.out.println("main thread");
}
static class Deferrable extends Thread {
Thread t;
Deferrable(Thread t) {
this.t = t;
// optional
// setDaemon(true);
start();
}
@Override
public void run() {
try {
// awaits termination of given Thread before commencing
t.join();
System.out.println("other thread");
} catch (InterruptedException ie) {
// TODO handle
}
};
}
これは常に印刷されます:
main thread
other thread
なぜ人為的に言うのですか?そしてなぜあなたは 'Runtime.getRuntime()。addShutdownHook(...)'が良い解決策だと思いますか?元の質問は[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)です:OPは彼女が達成したいことを私たちに語っていません。彼女はすべて彼女の問題に対する解決策に焦点を当てていますが、実際の問題点はわかりません。 –
@ jameslarge「addShutdownHook」に言及した答えは本質的に優れていると思いますが、私の答えはうまくいきますが、人工的にはスレッドに参加することで機能が有効になっているからです。これは、同じことを達成するための別の方法と考えられるかもしれません。 – Mena
@jameslargeこれは、コメントを読んで、OPが何を望んでいるのかが少しはっきりしないと言った - 私は同意する。 – Mena
このような状況の典型的なシンクロナイザがCountDownLatch
です。それが必要なものをやって前にCountDownLatch
ために生成されたスレッドの待機を持っている、とあなたは2つのスレッドが必要なのですか、なぜあなたは、それらを同時に実行したくない場合はCountDownLatch.countDown()
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(1); // will need only one countDown to reach 0
new Thread(() -> {
try {
latch.await(); // will wait until CountDownLatch reaches 0
// do whatever is needed
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
// do stuff
// end main thread
latch.countDown(); // will make the latch reach 0, and the spawned thread will stop waiting
}
- 1. スレッドは終了後にもう一度実行されます
- 2. 子スレッドが実行を完了する前にメインスレッドが終了しますか?
- 3. メインスレッドは別のスレッドが実行を終了するのを待たずに
- 4. スレッドが終了した後でQt関数を実行するにはどうすればよいですか?
- 5. 終了後に実行されるinitコンテナに相当する
- 6. 終了後に実行ダイアログ
- 7. Webサービスリターン実行後に終了するスレッド?ここ
- 8. スクリプトの実行後に.pyファイルを終了させないようにする
- 9. メソッドの終了後にスレッドを実行しますか?
- 10. アプリケーション終了後にJNIメソッドが実行される
- 11. スレッドが終了した後に文を実行
- 12. キューは正常に実行されます。休憩の後に終了する代わりに終了する
- 13. スレッドがループ内でどのように実行されるか
- 14. スレッドの実行終了後の関数の実行
- 15. メインスレッドがDjangoを使用して終了した後でもスレッドが実行されています
- 16. 長時間実行するQtスレッドを終了するには
- 17. スレッドを終了するかメインスレッドに参加させる方法
- 18. 実行後にGnome端末が終了しないようにする
- 19. 実行終了時にスレッドが強制終了されるかどうかを確認する方法はありますか?
- 20. directionsDisplayの終了後にのみ関数を実行するにはどうすればよいですか?
- 21. プログラム実行中にスレッドが終了する
- 22. Serialport DataRecievedスレッドが実行前に終了する
- 23. 前のブロックが終了した後にJavaScriptブロックが実行されるようにするにはどうすればよいですか?
- 24. スレッド終了後にFreeAndNill()を自動的に実行する方法
- 25. アプリケーション終了後にMicrosoft Outlook 2010スクリプトが実行されない
- 26. goroutineがexecの後にメインスレッドが実行されていない?
- 27. 3分後にバックグラウンド実行が自動的に終了する
- 28. sass-loaderとExtractTextPluginの終了後にPOSTCSSを実行するにはどうすればよいですか?
- 29. ロジックが実行される前にプログラムが終了する
- 30. ターゲット関数の完了後にPythonスレッドが確実に消滅するようにするにはどうすればよいですか?
を呼び出すことにより、メインスレッドの仕上げを持っていますか? –
私はそれを同時に実行したい、しかし、メインが完了する前に確実に... – Sharon182
あなたは、前に終了するメインスレッド... _what_正確にしたいですか?そして、Scott Hunterが言ったことと同じように:あなたは何かをするメインスレッドを持っています。私はそれが何であるのか分からないが、それは何でもM() 'と呼んでみよう。 'M()'が終わった後に何か起こりたいことがあります。それを 'S()'と呼ぶことにしましょう。あなたのメインスレッドが 'M()'をしてから 'S()'を実行するのはなぜですか?あなたは何を達成しようとしていますか? –