簡體   English   中英

為什么線程在執行main方法后運行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM