如何在另一个线程仍在运行时停止主线程

时间:2014-04-23 09:46:17

标签: java multithreading

我在我的main方法中启动了t1线程并且想要停止主线程,但我的t1线程仍在运行。 有可能的?如何?

public static void main(String[] args) 
{
    Thread t1=new Thread()
    {
      public void run()
      {
          while(true)
          {
              try
              {
                  Thread.sleep(2000);
                  System.out.println("thread 1");

              }
              catch(Exception e)
              {}
          }             
      }
    };

    t1.start();    
}

4 个答案:

答案 0 :(得分:3)

当Java程序启动时,一个线程立即开始运行。这通常称为程序的 main 线程,因为它是程序开始时执行的线程。主要线程很重要有两个原因:

•它是产生其他“”线程的线程 •它必须是完成执行的最后一个线程。当主线程停止时,程序终止。

还有一件事,程序在所有非守护程序线程死亡时终止(守护程序线程是一个标有setDaemon(true)的线程)。

这是一个简单的小代码片段,用于说明差异。尝试使用setDaemon中的每个true和false值。

public class DaemonTest {
    public static void main(String[] args) {
        new WorkerThread().start();
        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {}
        System.out.println("Main Thread ending") ;
    }
}

public class WorkerThread extends Thread {
    public WorkerThread() {
        setDaemon(false) ;   // When false, (i.e. when it's a user thread),
                // the Worker thread continues to run.
                // When true, (i.e. when it's a daemon thread),
                // the Worker thread terminates when the main 
                // thread terminates.
    }

    public void run() {
        int count=0 ;
        while (true) {
            System.out.println("Hello from Worker "+count++) ;
            try {
                sleep(5000);
            } catch (InterruptedException e) {}
        }
    }
}

答案 1 :(得分:2)

常规线程可以阻止虚拟机正常终止(即到达主方法的末尾 - 在您的示例中,您使用System#exit()),这将根据主机终止VM文档)。

对于不阻止常规VM终止的线程,必须在启动线程之前通过Thread#setDaemon(boolean)将其声明为守护线程。

在你的例子中 - 主线程在到达代码结束时(t1.start();)之后死亡,并且当t1到达代码末尾时(VM之后)(包括t1-) true)aka never或异常终止。)

比较this question,此answer to another similar questiondocumentation

答案 2 :(得分:0)

System.exit(0)退出当前程序。

Thread.join()”方法我帮助您实现您想要的目标。

答案 3 :(得分:0)

在任何其他线程运行时,您无法停止主线程。 (所有子线程都是从主线程中诞生的。)您可以使用函数Thread.join()来保持主线程在其他线程执行时等待。