- 创建2个线程,打印从0到99这100个数字,要求线程交叉顺序打印。
要求使用线程间通信实现。即我打印一个数字,你打印一个数字,两线程协作完成。
比如:
线程1: 0
线程2: 1
线程1: 2
线程2: 3
线程1: 4
线程2: 5
个人思路图:
测试类:
public class TestPrinter {
public static void main(String[] args) {
Printer printer = new Printer(0);
Commander commander = new Commander(printer);
Worker worker1 = new Worker(printer);
Worker worker2 = new Worker(printer);
new Thread(commander,"命令中心").start();
new Thread(worker1,"线程1").start();
new Thread(worker2,"线程2").start();
}
}
命令下发类:
ppublic class Commander implements Runnable {
private Printer printer;
private UpNumber upNumber;
public Commander(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
upNumber = new UpNumber(100);
synchronized (printer) {
while (printer.num < upNumber.upNumber) {
if (printer.num >= upNumber.upNumber) break;
if (!printer.isEquals()) {
try {
printer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
printer.givePrinterTask(printer.num);
printer.notifyAll();
}
}
}
}
}
”工人“类:
public class Worker implements Runnable {
private Printer printer;
private UpNumber upNumber;
public Worker(Printer printer) {
this.printer = printer;
}
@Override
public void run() {
upNumber = new UpNumber(100);
synchronized (printer) {
while (printer.num < upNumber.upNumber) {
if(printer.num >= upNumber.upNumber) break;
if(printer.isEquals()) {
try {
printer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
printer.printTask();
printer.notifyAll();
}
}
}
}
}
容器类:
public class Printer {
int num;
int flag = -1;
public Printer(int num) {
this.num = num;
}
public void givePrinterTask(int newnum) {
this.num = newnum;
this.flag = 0;
}
public void printTask() {
System.out.println(Thread.currentThread().getName() + ":" + num);
flag = -1;
num++;
}
public boolean isEquals() { return flag == -1; }
}
class UpNumber {
int upNumber;
public UpNumber(int upNumber) {
this.upNumber = upNumber;
}
}