我有这项作业,可以模拟打印机的行为,在该行为下,打印作业可以以不同的时间间隔或同时提交给打印机。因此,必须在此处使用thread.start()
,打印机将从打印机队列中取出一个作业并进行打印,而其他作业则等待轮换。
总共我只需要编写3个类,Admin
类,PrintRequest
类和Printer
类。
这是我的代码:
public class Admin{
public static void main(String[] args){
Printer printer = new Printer();
for(int x=0; x<10;x++){
PrintRequest printRequest = new PrintRequest(x,printer);
printRequest.start();
}
}
}
public class PrintRequest extends Thread {
private static int duration;
private static int id;
private static Printer printer;
public PrintRequest(int id, Printer printer){
duration = (int)Math.ceil(Math.random()*1000);
this.id = id;
this.printer = printer;
}
public void run(){
printer.printJob(id, duration);
}
}
public class Printer{
public static synchronized void printJob(int id, int duration){
System.out.println("Printing " + id);
try{Thread.sleep(duration);}
catch(InterruptedException ex){System.out.println(ex.getMessage());}
System.out.println("Completed printing " + id);
}
}
输出存在一些问题,这不是我想要的输出-从ID 0-10打印。相反,输出是这样的:
那么我的代码有什么问题?我认为这是Admin
类循环的问题,但是我应该如何对其进行改进以使其能够正常运行呢?
答案 0 :(得分:2)
您的代码有几个问题。
首先,我认为您应该查找static variable是什么。实际上,您所有的PrintRequests
都具有相同的id
,我认为这不是您想要的。
此外,您生成睡眠持续时间的行仅生成0到1000之间的数字。这意味着作业持续时间不到一秒钟,并且您的输出可能与您期望的不一样。
将行更改为
duration = (int)(1000 + (Math.random()*5000));
这给了我以下输出
Printing 0
Printing 2
Printing 1
Printing 4
Printing 5
Printing 6
Printing 7
Printing 8
Printing 3
Printing 9
Completed printing 6
Completed printing 4
Completed printing 8
Completed printing 2
Completed printing 9
Completed printing 3
Completed printing 1
Completed printing 0
Completed printing 7
Completed printing 5
您可能会问:为什么不按顺序打印?
这是因为您无法按顺序控制Java像您所做的那样在循环中启动线程的顺序。如果确实需要,则必须添加一些其他机制来增强它。