我正在编写一个具有多个线程的Java程序。其中一个线程负责从标准输入中读取行并对其进行解析。
正常运行时一切正常,但当程序在后台(在Linux中)运行时,使用:
$ java -jar my_jar_file &
我的程序挂起(至少在进入前台之前)。
当在后台运行时,我并不真正需要标准输入,但我也不希望我的程序挂起。
我寻找了一种方法来用程序确定进程是否在后台运行,但找不到
这是从标准输入读取的代码:
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也如下所示:
public class TakeInput
{
public static void main(String[] args)
{
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(inputStreamReader);
String line = null;
try {
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
写一个文本文件作为test.txt,上面写着
test1
test2
test3
我不相信Java程序能够确定它是在前台还是后台运行。
我尝试了System.console()
,结果如下:
- Linux-如果从文件重定向stdin,则返回null,与前台/后台状态无关
- Windows——同样的东西
- Cygwin-似乎总是返回null
我怀疑您需要从命令行调用程序作为
java -cp ... ClassName < /dev/null
尝试使用.ready()函数。
try {
if (stdError.ready())
{
while((line= stdError.readLine()) != null){
logger.error(line);
}
}
}
对stdout执行同样的操作。