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

时间:2013-01-23 11:21:39

标签: c# multithreading jvm

我在C#中编写了一个小程序,它将被集成到巡航控制中(编辑:oops,太早按下输入),在他们自己的单独线程中创建某些(而非预定义的)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; } }

}

1 个答案:

答案 0 :(得分:1)

它不起作用,因为杀死线程不会自动杀死您生成的进程(独立)。 一般来说,杀死一个线程是不好的做法。你应该通知线程退出,这样它就可以进行清理(将进程拆除),并且干净地返回。