我要学习Java中的线程。我刚刚创建了一个新线程,就可以了,我希望程序在完成某些操作后关闭,但是当我在线程内调用System.exit(0);
时,程序将不会关闭!
代码:
public class Humaida
{
public Thread thread;
public Humaida()
{
thread = new Thread(() -> //i guess it using lambda expression,i just copied it
{
try
{
System.out.println("inside thread");
System.exit(0); // i think this line have to close\terminate JVM or the whole program
} catch (Exception e)
{
e.printStackTrace();
}
});
thread.start(); //IMO this should be last line to execute
System.out.println("after thread.start"); //shouldn't be run cause System.exit(0); reached
printIt("after reading thread"); // i used my method just to ensure that program running
}
public static void main(String[] args)
{
new Humaida();
}
public void printIt(String text)
{
System.out.println(text);
}
}
我得到一些奇怪的输出,例如
1st run:
after thread.start
inside thread
Press any key to continue . . .
2nd run:
after thread.start
after reading thread
inside thread
Press any key to continue . . .
3rd run:
after thread.start
inside thread
after reading thread
Press any key to continue . . .
让我们忘记相同代码的不同输出,这是另一个问题。
我搜索了一些解决方案,我尝试了System.exit(-1);
和thread.kill()
,但是它也不起作用。
这是怎么回事?
System.exit(0);
只是杀死了这个线程,而不是杀死了主线程吗?
答案 0 :(得分:1)
线程的重点是并行执行操作。您所看到的是比赛条件。
当您执行thread.start();
时,它将开始在线程中运行代码,而且还将立即继续执行System.out.println("after thread.start");
语句。这就是为什么您可能会看到两者的原因。
如果要等到线程完成,可以执行以下操作:
thread.start();
try {
System.out.println("Main thread waiting for new thread to finish");
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
在这种情况下,您将看到整个VM在线程完成之前退出。
答案 1 :(得分:0)
出于教育目的,请尝试在System.exit()之后放置另一个println(“ Say what?”)。如果“说什么?”显示,肯定有问题。
您已经在两个线程之间创建了竞争条件。第一个线程到达的距离取决于新线程运行的速度。唯一可以保证显示的是“内部线程”。