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