Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当循环在main中运行时,如何实现一个单独的线程来评估用户输入?_Java_Multithreading - Fatal编程技术网

Java 当循环在main中运行时,如何实现一个单独的线程来评估用户输入?

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.

我正在设计一个打印队列程序,随机生成打印作业,并根据每个打印作业的时间,“打印”几秒钟,挂起主线程,同时另一个线程不断检查用户是否按下了enter键,在主线程或“Q”按钮中生成要添加到队列末尾的新打印作业,发出结束程序的信号。以下是相关的代码位:

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();