Java 当循环在main中运行时,如何实现一个单独的线程来评估用户输入?
我正在设计一个打印队列程序,随机生成打印作业,并根据每个打印作业的时间,“打印”几秒钟,挂起主线程,同时另一个线程不断检查用户是否按下了enter键,在主线程或“Q”按钮中生成要添加到队列末尾的新打印作业,发出结束程序的信号。以下是相关的代码位:Java 当循环在main中运行时,如何实现一个单独的线程来评估用户输入?,java,multithreading,Java,Multithreading,我正在设计一个打印队列程序,随机生成打印作业,并根据每个打印作业的时间,“打印”几秒钟,挂起主线程,同时另一个线程不断检查用户是否按下了enter键,在主线程或“Q”按钮中生成要添加到队列末尾的新打印作业,发出结束程序的信号。以下是相关的代码位: Scanner input = new Scanner(System.in); AdPrint addPrint = new AdPrint(); addPrint.start(); for (int i = 0; i < printQueue.
Scanner input = new Scanner(System.in);
AdPrint addPrint = new AdPrint();
addPrint.start();
for (int i = 0; i < printQueue.size(); i++)
{
System.out.println("Printing " + i + " of " + printQueue.size()
+ "\n" + printQueue.get(i).getJobTime()
+ " seconds remaining."
+ "\nPlease press \"Enter\" to submit a new print"
+ " job or \"Q\" to quit.");
addPrint.setI(i);
addPrint.setInput(input);
addPrint.setJobGen(jobGen);
addPrint.setPrintQueue(printQueue);
Thread.currentThread().sleep(printQueue.get(i).getJobTime() * 1000);
printQueue.add(addPrint.getPrintQueue().get(i));
addPrint.interrupt();
}
现在,我在if(input.nextLine()!=null)
处得到以下NullPointerException:
我是线程新手,在花了一些时间修补这个之后,我想在这里得到一些帮助。为什么我会得到这个例外?如何使此线程,addPrint
,检查用户是否已请求其他打印作业?
编辑:
我忘了提到我有AdPrint的getter/setter方法:
public void setInput(Scanner input)
{
this.input = input;
}
在main()
中,在调用setInput
之前调用start()
:
Scanner input = new Scanner(System.in);
AdPrint addPrint = new AdPrint();
addPrint.start();
这意味着
扫描仪
仍将处于未初始化状态,因此仍为null
。在调用start()
之前,必须先调用setInput
。要测试这一点,您可以在调用input.nextLine()
之前添加一个print语句,以查看input
是否确实为null
在哪里初始化扫描仪输入
?我有用于所有变量的getter/setter方法。我忘了提到我最初在初始化所有内容之后放置了start()
,结果是异常位于线程“main”java.lang.IllegalThreadStateException位于java.lang.thread.start(thread.java:708)的PrintQueue.main(PrintQueue.java:48)
@CelineDion您是否只尝试过移动setInput()
在运行之前
?当我这样做的时候,它不会引起任何错误。我回家后,我必须试试。谢谢。嘿,你说的run
,是指start()
?@CelineDion是的
public void setInput(Scanner input)
{
this.input = input;
}
Scanner input = new Scanner(System.in);
AdPrint addPrint = new AdPrint();
addPrint.start();