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



我正在设计一个打印队列程序,该程序随机生成打印作业,并根据每个打印作业的时间,将它们"打印"几秒钟,挂起主线程,而另一个线程不断检查用户是否已按下 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();

}

AdPrint(由于我在日食中遇到的另一个问题,我故意拼写错误;我在另一台计算机上的 Dropbox 中更改了这个类,因为有一个新的副本,eclipse 由于某种原因没有将其识别为AddPrint,所以我不得不重命名该类以使其工作,但这不是这里的问题(是在等待期间处理用户输入的单独线程。在我开始之前,我只想指出,我最初在 for 循环中addPrint.start();没有interrupt方法,但我意识到会发生什么,然后 java 会在某种失控的反馈循环中创建无限多个并行线程。我只是认为addPrint(实例(的值会发生变化,但事实并非如此。现在AdPrint

import java.util.LinkedList;
import java.util.Random;
import java.util.Scanner;
public class AdPrint extends Thread
{
private Scanner input;
private Random jobGen;
protected LinkedList<PrintJob> printQueue;
int i;
private boolean run = true;
private String choice = new String();
public void run()
{
while (run)
{
if (input.nextLine() != null)
{
this.choice = input.nextLine();
if (choice.equalsIgnoreCase("q"))
{
for (int i = 0; i < printQueue.size(); i++)
{
System.out.println(printQueue.get(i).toString());
}
}
else if (choice.equalsIgnoreCase("\n"))
{
int printTime = jobGen.nextInt(10);
PrintJob job = new PrintJob();
job.setJobNum(i);
job.setJobTime(printTime);
printQueue.add(job);
}
}
else if (input.nextLine() == null) {
this.choice = input.nextLine();
}
}
}

现在就目前而言,我在if (input.nextLine() != null)得到以下 NullPointerException:

Exception in thread "Thread-0" java.lang.NullPointerException
at AdPrint.run(AdPrint.java:19)

我是线程的新手,在花了一些时间修补这个之后,我想在这里得到一些帮助。为什么我会收到此异常?如何使此线程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();

这意味着Scanner仍将未初始化,因此仍null。您必须先呼叫setInput,然后才能呼叫start()。要对此进行测试,您可以在调用input.nextLine()之前添加一个 print 语句,以查看input确实null

最新更新