Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用Java创建一个后台线程,以允许主应用程序完全退出?这在Linux中有效,但在Windows中不起作用_Java_Multithreading_Process_Background_Runtime.exec - Fatal编程技术网

如何用Java创建一个后台线程,以允许主应用程序完全退出?这在Linux中有效,但在Windows中不起作用

如何用Java创建一个后台线程,以允许主应用程序完全退出?这在Linux中有效,但在Windows中不起作用,java,multithreading,process,background,runtime.exec,Java,Multithreading,Process,Background,Runtime.exec,我有一个Java应用程序,它创建一个新线程来做一些工作。我可以毫无问题地启动新线程 当“main”程序终止时,我希望我创建的线程保持运行-它确实如此 但问题是,当我从Eclipse或Windows下的Ant运行主应用程序时,除非后台进程被终止,否则控件不会返回 如果我在ant中分叉主java进程,我希望在主线程完成其工作后,控制返回ant。。。但实际上,ant继续等待,直到主进程和创建的线程都终止 如何在后台启动线程,以便在“main”应用程序完成时控制返回到ant?(顺便说一句,当我在Linu

我有一个Java应用程序,它创建一个新线程来做一些工作。我可以毫无问题地启动新线程

当“main”程序终止时,我希望我创建的线程保持运行-它确实如此

但问题是,当我从Eclipse或Windows下的Ant运行主应用程序时,除非后台进程被终止,否则控件不会返回

如果我在ant中分叉主java进程,我希望在主线程完成其工作后,控制返回ant。。。但实际上,ant继续等待,直到主进程和创建的线程都终止


如何在后台启动线程,以便在“main”应用程序完成时控制返回到ant?(顺便说一句,当我在Linux下运行同一个应用程序时,我可以毫无问题地做到这一点)。

您可能想要创建一个:thread.setDaemon(true)。

您最好的选择是为此启动一个完全独立的程序,它独立于启动程序。您可以使用或来实现这一点。

听起来您需要将“主”线程和“后台”线程作为单独的进程。Fork是第一个进程,它运行“主”线程。该进程反过来又派生出运行“后台”线程的第二个进程。在Windows上,您可能必须使用
start/b
启动后台进程(通过Java的
Runtime.exec()
API)


我不明白这在Linux下是如何工作的。由
Runtime.exec()创建的
进程
正在运行或未运行。当Java程序等待一个
进程
完成时,它不关心子进程中是否有一个线程或多个线程在运行。如果您能更清楚地描述它在Linux下是如何工作的,可能会有所帮助。

在完成所有操作之前,JVM不会返回控件。这意味着所有线程都必须返回,所有窗口都必须被销毁,main必须退出

或者调用System.exit()


如果它能在Linux上运行,我敢肯定你会发现你的后台线程也被终止了——否则这是非常糟糕的。

如果我正确理解了这个问题,程序似乎运行正常。。。
main
线程完成并退出,“
background
”线程继续运行。在所有非守护进程线程终止之前,JVM不会退出。如果希望JVM进程在
main
线程终止时终止,则需要按照Roman的指示执行并调用
thread.setDaemon(boolean)

但是,如果问题是
main
线程正确终止,但是
background
从未终止,即使它已经完成了您赋予它的任务,那么可能
background
处于死锁状态

IMO最好的第一步是在进程上运行转储堆栈,并使用其线程调试工具找出
background
在做什么以及为什么挂起。(您也可以通过发送堆栈
kill-QUIT
使JVM转储堆栈,如果在*nix上…windows上有类似的Break键,但我记不起具体细节。)Java 6中的堆栈转储非常复杂,它将指示每个线程锁定的对象可能出现死锁


使用起来很有趣,所以如果你从未使用过它,请尝试一下。

我想办法了。事实证明,在Windows中,从同一命令窗口启动的进程将等待子进程完成

您可以在eclipse中对此进行测试:生成一个程序并执行一个应用程序(例如Notepad.exe)。您会发现java程序终止,但红色按钮仍然处于活动状态。控件不会返回eclipse,直到您关闭应用程序(例如notepad.exe)。这显然是因为java程序和已执行程序使用相同的命令窗口。同样的事情也发生在蚂蚁身上

在linux中,进程不像在windows中那样继承命令窗口,因此当进程完成时,控制返回到eclipse


在这两种情况下,生成的进程在终止之前都保持活动状态。

听起来他只是想在主程序终止时保持线程运行。这对我不起作用。主程序终止后,环境仍然挂起。我明白了。我认为一个单独的过程会起作用。你知道为什么会被绞死吗?这是因为线程使用相同的JVM吗?事实上,它使用相同的进程。不过,我必须承认,我不能完全肯定所提出的任何解决办法是否真的会启动一个单独的进程
Desktop#open()
当然可以。但是另外两个。。从经验看不出这一点:)应该注意,您所描述的是shell的功能,而不是操作系统。换句话说,只要某个非守护进程线程仍处于活动状态,应用程序仍在运行且尚未退出-只是您的shell没有等待应用程序的输出。从下面您自己的回答来看,我认为您在这里指的是“进程”,而不是“线程”。