使用Java和Java线程的打印机模拟
我的任务是模拟打印机的行为,其中打印作业可能以不同的时间间隔或同时提交给打印机。因此,这里必须使用使用Java和Java线程的打印机模拟,java,multithreading,Java,Multithreading,我的任务是模拟打印机的行为,其中打印作业可能以不同的时间间隔或同时提交给打印机。因此,这里必须使用thread.start(),打印机将从打印机队列中获取一个作业并打印它,而其他作业则等待轮到它们 我总共只需要写3个类,即Admin类、PrintRequest类和Printer类 这是我的密码: public class Admin{ public static void main(String[] args){ Printer printer = new Printer
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);
}
}
公共类管理员{
公共静态void main(字符串[]args){
打印机=新打印机();
对于(intx=0;x,您的代码有几个问题
首先,我认为您应该查找a是什么。实际上,您所有的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在循环中启动线程的顺序。如果您真的想这样做,您必须添加更多的机制来增强这一点。打印机按顺序执行作业,因此将作业表示为线程是一个坏主意。线程本质上是并行的,在这里您可以看到花费精力抑制并行性。更好的方法是启动表示打印机的单线程,并为打印作业创建一个队列。因此,您建议我将printer类扩展为线程,对吗?队列的第二部分,是否有实现的示例?提前感谢!这似乎是生产者-消费者问题。@RandomDude请参见,例如,Re,“…将打印机类扩展为线程…”这可能会起作用,但设计更好(特别是如果您试图构建真正的、商业质量的软件),将打印机
的概念与运行它的线程分开。我将定义一个打印机
类,该类包含一个构造函数,该构造函数接受一个PrintQueue
参数和一个run()
方法。我的打印机
对线程一无所知。然后我将制作一个更高级别的“胶水”创建一个打印队列
实例的例程,创建一个打印机
为其提供服务,创建一个线程
来运行打印机
,并将它们连接在一起。嗯,应该尝试一下!这似乎是我想要的,是的,我知道它不应该按顺序运行!