使用Java和Java线程进行打印机模拟

时间:2019-04-16 09:52:11

标签: java multithreading

我有这项作业,可以模拟打印机的行为,在该行为下,打印作业可以以不同的时间间隔或同时提交给打印机。因此,必须在此处使用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类循环的问题,但是我应该如何对其进行改进以使其能够正常运行呢?

1 个答案:

答案 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像您所做的那样在循环中启动线程的顺序。如果确实需要,则必须添加一些其他机制来增强它。