当进程在后台运行时,使用java.io.InputStreamReader读取标准输入会挂起

当进程在后台运行时,使用java.io.InputStreamReader读取标准输入会挂起,java,Java,我正在编写一个具有多线程的Java程序。其中一个线程负责从标准输入读取行并解析它们 正常运行时一切正常,但当程序在后台(在Linux中)运行时,使用: 我的程序挂起(至少在被带到前台之前) 在后台运行时,我并不真正需要标准输入,但我也不希望我的程序挂起 我搜索了一种通过编程确定进程是否在后台运行的方法,但没有找到它 以下是从标准输入读取的代码: InputStreamReader inputStreamReader = new InputStreamReader(System.in); Buff

我正在编写一个具有多线程的Java程序。其中一个线程负责从标准输入读取行并解析它们

正常运行时一切正常,但当程序在后台(在Linux中)运行时,使用:

我的程序挂起(至少在被带到前台之前)

在后台运行时,我并不真正需要标准输入,但我也不希望我的程序挂起

我搜索了一种通过编程确定进程是否在后台运行的方法,但没有找到它

以下是从标准输入读取的代码:

InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(inputStreamReader);

String line = null;

try {
  while ((line = br.readLine()) != null) {
    parseInputLine(line, br);
  }
} catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

据我所知,程序在到达
br.readLine()
命令时挂起。

我猜读卡器正在阻塞等待输入,您可以从命令行导入输入。

readLine是一个阻塞调用。因此,它显然在等待输入。如果您想让它在后台运行,那么将来自如下文件的输入传递给它

java TakeInput < test.txt &
编写一个文本文件test.txt,其中包含

test1
test2
test3

我不相信Java程序可以确定它是在前台还是后台运行

我尝试了
System.console()
,结果如下:

  • Linux-如果stdin从文件重定向,则返回null,与前台/后台状态无关
  • Windows-同样的东西
  • Cygwin-似乎总是返回null
我怀疑您需要从命令行调用该程序

java -cp ... ClassName < /dev/null
java-cp。。。类名
尝试使用.ready()函数

try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}

对stdout也要这样做。

在后台运行程序时,从stdin读取是没有意义的。是的,某些读/写操作的标准I/O块。如果你希望它是非阻塞的,你应该使用NIO。我完全同意,这就是为什么我试图找到一种方法来检测我在后台运行,然后甚至不尝试从STDINJosh读取-什么是“NIO”?@Ari新的输入/输出。一篇比较2的文章可以找到问题是为什么这会阻塞整个程序,而不让其他线程正常运行(当进程在前台时,它可以正常工作)。我知道readLine正在阻塞,这就是为什么我有一个专用线程。我试图理解的问题是,为什么其他(完全不相关的)线程在后台运行时挂起(在前台一切正常)看看这个。。。使用

java -cp ... ClassName < /dev/null
try {
      if (stdError.ready()) 
      {
            while((line= stdError.readLine()) != null){
                logger.error(line);
            }
      }
}