Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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和Java线程的打印机模拟_Java_Multithreading - Fatal编程技术网

使用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()
方法。我的
打印机
对线程一无所知。然后我将制作一个更高级别的“胶水”创建一个
打印队列
实例的例程,创建一个
打印机
为其提供服务,创建一个
线程
来运行
打印机
,并将它们连接在一起。嗯,应该尝试一下!这似乎是我想要的,是的,我知道它不应该按顺序运行!