gpt4 book ai didi

java - 使用 Java 和 Java 线程的打印机模拟

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:30 24 4
gpt4 key购买 nike

我的作业是模拟打印机的行为,其中打印作业可能会以不同的时间间隔或同时提交给打印机。因此,必须在此处使用 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 打印。相反,输出是这样的:

enter image description here

那么我的代码有什么问题呢?我认为这是 Admin 类循环的问题,但我应该如何改进它才能使其正常运行?

最佳答案

您的代码有几个问题。

首先,我认为您应该查找 static variable 是什么是。实际上,您所有的 PrintRequests 都具有相同的 id,我认为这不是您想要的。

此外,您生成 sleep 持续时间的行仅生成 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 在循环中启动线程的顺序,就像您所做的那样。如果你真的想要,你将不得不添加更多的机制来增强它。

关于java - 使用 Java 和 Java 线程的打印机模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55705335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com