当线程死掉时,包含JVM的线程不会终止JVM

问题描述:

我已经在C#中编写了一个小程序,它将集成到巡航控件中(编辑:oops,按回车键太早),创建特定的(并且不是预定义的)JVM在他们自己的独立线程中。但是,在杀死线程时,JVM仍然存在并且未被卸载。该功能可以正确处理.bat文件 - 但是如果它们调用JVM,它仍然保持打开状态!当线程死掉时,包含JVM的线程不会终止JVM

每个线程从这个类的一个实例创建并调用运行()

_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; } } 

} 
+0

关闭为什么?问题在于为什么进程在创建它们的线程关闭之后仍然存在......以及如何解决这个问题。 – Izzy

它不工作,因为杀死线程不会自动杀死你产生了过程(独立的)。一般来说,杀死一个线程是不好的做法。您应该指示线程退出,以便它可以进行清理(将流程关闭),并返回干净。

+0

是的。我通常指示线程退出,但Proc.Kill()似乎不是WAI,即使我在主进程中放弃线程以退出足够快时,JVM仍然保留。 – Izzy

+0

所以你的问题是你在新进程主线程上调用Abort并且JVM不能退出?或者说,Proc.Kill似乎并没有杀死这个进程? –

+0

该标志在线程中止(短时间之后)之前在主进程中设置,因此都是。 - 主进程确实检测到两个进程中的一个完成并退出并尝试杀死另一个进程但是失败 – Izzy