gpt4 book ai didi

java - 在线程内使用 System.exit() 后显示主线程的输出

转载 作者:行者123 更新时间:2023-12-02 10:41:26 24 4
gpt4 key购买 nike

我正在学习 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); 是否只是终止该线程,而不是主线程?

最佳答案

线程的目的是并行地做事情。您看到的是竞争条件。

当您执行thread.start();时,它将开始运行线程中的代码而且立即继续使用System.out。 println("thread.start 之后"); 语句。这就是为什么您可能会看到两者。

如果你想等到线程完成,你可以这样做:

    thread.start();                           
try {
System.out.println("Main thread waiting for new thread to finish");
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

在这种情况下,您将看到整个虚拟机在线程完成之前退出。

关于java - 在线程内使用 System.exit() 后显示主线程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52897390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com