java - Log4j 挂起我的应用程序

标签 java multithreading log4j

我正在尝试从我的应用程序中的外部应用程序获取控制台输出。当我从代码中调用外部应用程序时,它会挂起并显示以下消息:

配置日志记录...

从以下位置配置 log4j:C:\GPAT\log4j.cfg

什么也没发生。我在网上查了一下,看来可能是线程的问题。但我无法修改这个外部应用程序,我必须通过 log4j。我这样读取外部应用程序:

StringBuffer 输出 = new StringBuffer();

<前>尝试{ 运行时 rt = Runtime.getRuntime(); 进程 proc = rt.exec(GSATCommand); BufferedReader 输入 = new BufferedReader(new InputStreamReader(proc.getInputStream())); System.out.println("测试运行..."); 字符串行=空; while ((line = input.readLine()) != null) { System.out.println(行);//将测试输出写入控制台 输出.追加(行);输出.append("\n"); } int exitVal = proc.waitFor(); System.out.println("进程退出值:"+ exitVal); System.out.println("测试执行成功"); } catch (可抛出的t) { t.printStackTrace(); }

感谢您的阅读。

最佳答案

您需要在单独线程中使用衍生进程中的stdout和stderr,以防止阻塞行为(您的衍生进程将写入缓冲区,如果这些缓冲区没有被清空,则会阻塞您的消费过程)。

参见this answer的第二段了解更多详细信息以及合适修复程序的链接。

关于java - Log4j 挂起我的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4193293/

相关文章:

java - 如何在 struts2 应用程序中下载 zip 文件

java - 如何将 photoview 或 Imageview 放入 viewpager android

java - 我可以使用 Arrays.copyOf 制作二维数组的防御性副本吗?

C:同时运行两个函数?

Java 执行器服务线程池

java - System.out.println 语句在 websphere 应用服务器中打印在哪里

log4j - 是否有允许您写入 GZIP 文件的 log4j 或 Logback 的附加程序/配置?

java - java中的类实现是什么?

java - 登录 Java 和一般 : Best Practices?

c++ - 由多个线程访问的队列的推荐模式......工作线程应该做什么?