2013-06-04 97 views
1

我一直试图在谷歌中搜索很长一段时间,但没有取得任何成功。我希望在这里解决我的问题。
第一功能:Java进程在进程中间停止

public void startTFServer(Channel c) { 
    try { 
     ProcessBuilder procBuilder = new ProcessBuilder("tfs.exe"); 
     procBuilder.redirectErrorStream(); 
     Process proc = null; 
     System.out.println(Runtime.getRuntime().freeMemory()); 
     proc = procBuilder.start(); 
     System.out.println(Runtime.getRuntime().freeMemory()); 
     StreamGobbler gobbler = new StreamGobbler(proc.getInputStream(), "STD_OUT"); 
     gobbler.start(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

捕获过程输出的线程:

private class StreamGobbler extends Thread { 
    InputStream is; 
    String type; 

    private StreamGobbler(InputStream is, String type) { 
     this.is = is; 
     this.type = type; 
    } 

    @Override 
    public void run() { 
     try { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) {    
       System.out.println(type + "> " + line); 
      } 
     } 
     catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

问题: 当运行输入中断在同一个地方的每个应用程序时间。我使用“Process class”运行的应用程序是需要相当一些内存才能运行的服务器,难道这是导致进程无法完成加载我的应用程序的原因之一吗?我在想内存会耗尽,但我无法真正诊断它。

任何帮助将不胜感激!

+0

当你说“中断”,你是什么意思是什么呢?你遇到异常,还是只是挂起? –

+0

它在哪里呢?你说它每次都发生在同一个地方 - 哪一行似乎是负责任的? –

+0

中断发生在加载某个类型的怪物(正在执行的服务器进程)之后。它只停留在那条线上,而没有进一步发展。没有例外(即使在ErrorOutputStream中也没有)。 (当我在桌面上自己执行它时,应用程序运行得很好,但是当包装在Java Process类中时,它似乎内存不足,至少这是我认为的情况) –

回答

1

还有,我注意到一个问题:

procBuilder.redirectErrorStream(); 

这不是你想要的。这是一个getter方法,告诉你redirectErrorStream属性的值是什么。它可能是你有错误,你被阻止,因为他们没有阅读。因此,你需要使用的setter方法:请参阅API redirectErrorStream(boolean)

procBuilder.redirectErrorStream(true); 
+0

哇,我多么愚蠢......它的工作原理!万分感谢! =) –

+0

非常欢迎:)。但我认为这个方法的名称是误导性的,而不是遵循这些惯例。如果它被命名为isRedirectErrorStream()或getRedirectErrorStream(),它会更清晰。 –

+0

我同意!我不知道这是一个“吸气剂”,你会认为这将做名称所说的,以及我错了:(令人惊讶的是,有很棒的人在那里可以帮助你解决这个问题,例如在一小时内后,我印象深刻!:) –

1

如果我错了,我很抱歉,但我认为你正在耗尽来自外部过程的输出,而不是等到它完成才能继续阅读。我的意思是,基本上:

while ((line = br.readLine()) != null) {    
    System.out.println(type + "> " + line); 
} 

如果进程停止向输出写入一秒钟,记录器将停止记录。如果它再次开始写入,您将不在循环中。

+0

感谢您的输入!可悲的是,它似乎不是原因... 似乎永远停在这里: STD_OUT> [菌种:: addMonster]找不到Waspoid STD_OUT> [菌种:: addMonster]找不到履带 STD_OUT> [菌种:: addMonster]找不到履带 STD_OUT> [ Spawn :: addMonster]找不到Crawler STD_OUT> [Spawn :: addMonster]找不到Crawler STD_OUT> [Spawn :: addMonster]无法找到Boozer 虽然有很多更多的输入。 –

+0

我认为他是对的 - 试着在那个循环内睡一秒左右,让输入累积。可能不是一个长期的解决方案,但它应该确认诊断。 –

+1

我不认为这是真的,因为readline会阻塞,直到有更多的数据。只有当输入终止时,他才会收到null。看到以下并检查排名最高的答案http://stackoverflow.com/questions/2776724/java-bufferedreader-readline-blocking –