2016-01-13 52 views
0
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方法后运行?

Main Prgm Started... 
Main Prgm Exited... 
Thread is running.. 
+0

因为它运行在一个单独的线程?除非你同步你的线程,否则它们独立运行,没有特定的顺序。 – Thilo

回答

2

Java程序将继续任何非daemon线程运行时运行。从下面的链接可以看出:“守护进程线程是一个线程,当程序完成但线程仍在运行时,它不会阻止JVM退出。守护进程线程的一个例子就是垃圾回收,您可以使用setDaemon()方法来更改线程守护程序属性。“ What is Daemon thread in Java?

默认情况下,所有创建的线程都是守护进程。您需要将其设置为非守护进程。

1

你不会要求主线程在退出之前等待t1完成,因此两个线程之间根本没有同步(并且你没有任何关于何时它们每个都会执行它们的println的任何保证) 。

如果你想主线程等待其他那么你应该使用join()功能,如:

t1.start(); 
t1.join(); 
System.out.println("Main Prgm Exited..."); 
0

或使用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..."); 
} 

}

0

如果您想知道程序何时完成,您需要关闭挂钩。从主返回不会杀死程序。

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..."); 
     } 
    }); 
} 
相关问题