Java代码实现:疯狂的打印机 问题描述 分别使用 Thread 和 Runnable 写具有两个同样功能的线程,打印从 1 到 1000(要能区分 是谁打印的)。启动这两个线程观看程序输出。给靠后 start 的线程设置优先级为 8,再 执行一次。并思考结果出现差距的原因。 注:将 2 次执行输出的结果分别保存在 2 个文件中,第一个文件名为:writer.txt, 第二 个文件名为 writer8.txt。
时间: 2024-03-23 21:39:45 浏览: 55
java实现打印功能代码
使用 Thread 实现:
```java
import java.io.FileWriter;
import java.io.IOException;
public class PrinterThread extends Thread {
private int start;
private int end;
public PrinterThread(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
try (FileWriter writer = new FileWriter("writer" + (threadName.endsWith("8") ? "8" : "") + ".txt")) {
for (int i = start; i <= end; i++) {
writer.write(threadName + ": " + i + "\n");
System.out.println(threadName + ": " + i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
PrinterThread t1 = new PrinterThread(1, 500);
PrinterThread t2 = new PrinterThread(501, 1000);
t2.setPriority(8);
t1.start();
t2.start();
}
}
```
使用 Runnable 实现:
```java
import java.io.FileWriter;
import java.io.IOException;
public class PrinterRunnable implements Runnable {
private int start;
private int end;
public PrinterRunnable(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public void run() {
String threadName = Thread.currentThread().getName();
try (FileWriter writer = new FileWriter("writer" + (threadName.endsWith("8") ? "8" : "") + ".txt")) {
for (int i = start; i <= end; i++) {
writer.write(threadName + ": " + i + "\n");
System.out.println(threadName + ": " + i);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
PrinterRunnable r1 = new PrinterRunnable(1, 500);
PrinterRunnable r2 = new PrinterRunnable(501, 1000);
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t2.setPriority(8);
t1.start();
t2.start();
}
}
```
这两个实现方式都创建了两个线程,分别打印从 1 到 500 和从 501 到 1000 的数字。在第二次执行中,将靠后 start 的线程 t2 设置了优先级为 8。
两次执行的结果可能会有差异,因为线程的调度是由 JVM 控制的,而 JVM 的行为是依赖于操作系统的。在不同的操作系统和 JVM 实现下,线程的调度方式可能有所不同。设置线程优先级只是给 JVM 一个提示,但并不能保证优先级高的线程一定比优先级低的线程先执行。因此,两次执行的结果可能会有不同的顺序。
此代码实现了使用 Thread 和 Runnable 两种方式实现疯狂的打印机,并演示了设置线程优先级的效果。
阅读全文