我在我的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();
}
答案 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 question和documentation。
答案 2 :(得分:0)
System.exit(0)
退出当前程序。
“Thread.join()
”方法我帮助您实现您想要的目标。
答案 3 :(得分:0)
在任何其他线程运行时,您无法停止主线程。 (所有子线程都是从主线程中诞生的。)您可以使用函数Thread.join()来保持主线程在其他线程执行时等待。