包含 JVM 的线程不会在线程死亡时终止 JVM

本文关键字:线程 JVM 终止 包含 | 更新日期: 2023-09-27 17:55:15

我用C#编写了一个小程序,它将集成到巡航控制中(编辑:哎呀,按回车太早了),在他们自己的单独线程中创建某些(而不是预定义的)JVM。但是,当终止线程时,JVM仍然存在并且不会卸载。此功能适用于.bat文件,但如果它们调用 JVM,它仍然保持打开状态!

每个线程都是从此类的一个实例创建的,并调用 Run()

_Critical由主进程用于测试原因。

class BatThread
{
    private string _args, _fileName;
    private bool _critical;
    public ManualResetEvent Flag;
    public BatThread(string fileName, string args, bool critical)
    {
        _fileName = fileName;
        _args = args;
        _critical = critical;
        Flag = new ManualResetEvent(false);
    }
    public void Run()
    {
        using (Process Proc = new Process())
        {
            Proc.StartInfo.FileName = _fileName;
            Proc.StartInfo.Arguments = _args;
            Proc.StartInfo.RedirectStandardError = false;
            Proc.StartInfo.RedirectStandardInput = false;
            Proc.StartInfo.RedirectStandardOutput = false;
            Proc.StartInfo.UseShellExecute = true;
            Proc.Start();
            while (true)
            {
                if (Proc.WaitForExit(100))
                {
                    break;
                }
                else if (this.Flag.WaitOne(100))
                {
                    Proc.Kill();
                    break;
                }
                Thread.Sleep(5000);
            }
            this.Flag.Set();
        }
    }
    public bool critical { get { return _critical; } }
}

包含 JVM 的线程不会在线程死亡时终止 JVM

它不起作用,因为终止线程不会自动终止您生成的进程(独立)。通常,终止线程是一种不好的做法。您应该向线程发出退出信号,以便它可以执行清理(拆除进程),并干净地返回。