多线程打印数字
Problem Description
利用多线程按要求打印数字,线程计数从100开始,Thread1先打印101,102,103,104,105,106,107,108,然后是Thread2打印109,110,111,112,113,114,115,116,然后是Thread3打印117,118,119,120,121,122,123,124,接着再由Thread1打印125,126,127,128,129,130,131,132….以此类推, 直到打印到204。
请将前半部分代码补充完整。
// 你的代码将嵌入这里
public class Main {
public static void main(String[] args) throws InterruptedException {
object o = new object(); // 注意,O这里应该是大写,是Java祖先对象object,因为系统原因改不过来
new Thread(new PrintRunnable(1,o)).start();
new Thread(new PrintRunnable(2,o)).start();
new Thread(new PrintRunnable(3,o)).start();
}
}
Output Description
Thread1:101
Thread1:102
Thread1:103
Thread1:104
Thread1:105
Thread1:106
Thread1:107
Thread1:108
Thread2:109
Thread2:110
Thread2:111
Thread2:112
Thread2:113
…(此处省去中间打印的内容)
Thread1:200
Thread1:201
Thread1:202
Thread1:203
Thread1:204
解题代码
// PrintRunnable类 实现Runnable接口
class PrintRunnable implements Runnable {
// 全局变量num 用于记录打印的数字
private static int num = 100;
// 全局变量 cur 用于记录当前运行的线程id
private static int cur = 1;
// lock锁对象
private Object lock = null;
// 线程的id
private int id;
// 构造器 接收id和锁对象
public PrintRunnable(int id, Object lock) {
this.lock = lock;
this.id = id;
}
// 打印数字的方法
public void print() {
// 每个线程只打印8次
for (int i = 0; i < 8; i++) {
// 将num++
num++;
// 如果num > 204 退出循环 只打印到204
if (num > 204) break;
// 打印线程名信息 和 数字
System.out.println("Thread" + id + ":" + num);
}
}
// 实现run方法 线程启动之后会执行run方法中的逻辑
@Override
public void run() {
// 循环
while (true) {
// 使用synchronized 同步代码块 防止线程并发
// synchronized是比较重量级的锁 对性能有一定的影响
synchronized (lock) {
// 判断当前打印数字的线程id是否等于正在执行线程id
// 如果相等
if (cur == id) {
// 调用打印数字的方法
print();
// 设置下一个打印线程的id
cur = cur + 1;
// 由于只有三个线程 因此当前运行的线程id大于3时 将值设置为1
if (cur > 3) cur = 1;
// 如果没有轮到当前执行的线程打印
} else {
// 唤醒其它线程
lock.notifyAll();
// 异常处理 try catch
try {
// 如果数字大于204 结束循环
// 结束循环意味着run方法执行完毕 线程执行完成
if (num > 204) {
break;
// 否则 线程进入等待状态
} else {
// wait方法会释放synchronized同步锁并使当前线程进入等待状态
lock.wait();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}