mainメソッド内でスレッドが実行されているJavaアプリケーションをjaveしたとします。
mainメソッドのすべてのコードが実行された後。アプリケーションは、実行が終了するまでスレッドを待機しますか、それともアプリケーションとJVMを終了するだけです。
mainメソッド内でスレッドが実行されているJavaアプリケーションをjaveしたとします。
mainメソッドのすべてのコードが実行された後。アプリケーションは、実行が終了するまでスレッドを待機しますか、それともアプリケーションとJVMを終了するだけです。
java.lang.Thread
ドキュメントから:
Java仮想マシンが起動すると、通常、単一の非デーモンスレッドが存在します(通常、指定されたクラスのmainという名前のメソッドを呼び出します)。Java仮想マシンは、次のいずれかが発生するまでスレッドを実行し続けます。
- クラスRuntimeのexitメソッドが呼び出され、セキュリティマネージャがexit操作の実行を許可しました。
- runメソッドの呼び出しから戻るか、runメソッドを超えて伝播する例外をスローすることにより、デーモンスレッドではないすべてのスレッドが停止しました。
したがって、はい、待機しますが、デーモンスレッドとしてマークされたスレッドは待機しません。
次のコードで動作することがわかります。
public class ThreadTest {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("I'm still here!");
}
});
// uncomment following line to test with daemon thread
//thread.setDaemon(true);
thread.start();
System.out.println("Finished!");
}
}
アプリケーションは、実行が終了するまでスレッドを待機しますか
はい、メインスレッドが完全に実行されているかどうかに関係なく、子スレッドが完全に実行されるのを待ちます。
デーモンスレッドを待機しません。呼び出しによってスレッドがデーモンスレッドとして設定されている場合Thread.setDaemon(true);
開始されたスレッドがどの種類のスレッドであるかによって異なります。実行中のスレッドがすべてデーモンスレッドである場合、JVMは終了します。
デフォルトでは、スレッドはデーモンスレッドではありません。スレッドをデーモンスレッドにするには、開始する前に呼び出します。Thread.setDaemon(true)