2016-01-13 2 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..."); 
    } 
} 

Выход:Почему Thread работает после выполнения основного метода?

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

Потому что он работает в отдельной теме? Если вы не синхронизируете свои потоки, они запускаются независимо, без какого-либо определенного порядка. – Thilo

ответ

2

Java программы будут продолжать работать, пока какой-либо не- daemon поток выполняется. Из приведенной ниже ссылки: «Нить демона - это поток, который не предотвращает выход JVM, когда программа заканчивается, но поток все еще работает. Примером для потока демона является сбор мусора. Вы можете использовать setDaemon() метод для изменения свойств демона Thread. " What is Daemon thread in Java?

По умолчанию все созданные темы являются daemon. Вам нужно установить его как не-демона.

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

Если вы хотите узнать, когда программа завершена, вам нужен крюк остановки. Возврат из 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..."); 
     } 
    }); 
} 
Смежные вопросы