[英]if main method completes the execution, what happens to any long running thread?
[英]Why Thread is running after execution of main method?
public class TestThread {
public static void main(String[] args) {
System.out.println("Main Prgm Started...");
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running..");
}
});
t1.start();
System.out.println("Main Prgm Exited...");
}
}
輸出為:
Main Prgm Started...
Main Prgm Exited...
Thread is running..
當任何非daemon
線程正在運行時,Java程序將繼續運行。 從下面的鏈接:“守護程序線程是一個線程,它不會阻止JVM在程序完成但該線程仍在運行時退出。守護程序線程的一個示例是垃圾回收。您可以使用setDaemon()更改線程守護程序屬性的方法。” Java中的Daemon線程是什么?
默認情況下,所有創建的線程都是守護程序。 您需要將其設置為非守護程序。
您並沒有要求主線程在退出之前等待t1
完成,所以兩個線程之間根本沒有同步(並且不能保證兩個線程何時將執行他們的println
)。
如果要使主線程等待另一個線程,則應使用join()
函數,例如:
t1.start();
t1.join();
System.out.println("Main Prgm Exited...");
或使用CountDownLatch:
import java.util.concurrent.CountDownLatch;
公共類TestThread {
public static void main(String[] args) {
final CountDownLatch countDownLatch = new CountDownLatch(1);
System.out.println("Main Prgm Started...");
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running..");
countDownLatch.countDown();
}
});
t1.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main Prgm Exited...");
}
}
如果您想知道程序何時完成,則需要關閉掛鈎。 從main返回不會殺死程序。
public static void main(String[] args) {
System.out.println("Main Prgm Started...");
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread is running..");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
System.out.println("Thread is done..");
}
});
t1.start();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println("Main Prgm Exited...");
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.