题目:创建三个线程,第一个线程打印1 2 3 4 5, 第二个线程打印 6 7 8 9 10, 第三个线程打印11 12 13 14 15,然后第一个线程再打印16 17 18 19 20,然后第二个线程接着打印21… 依此类推,直到打印到100。
有哪些坑?
- synchronized关键字对值为[-128,127]之间的Integer类型,不起作用。所以不能用Integer作锁对象。
- 为了防止打印的值超过100,在每次输出钱都要检查是否超过100了。
- 网上答案有好多。跑起来符合题目要求的屈指可数。
我的答案:
public class PrintNumTest {
private static int flag = 1; //1:线程1执行,2:线程2执行,3:线程3执行
private static int num = 1; //输出的数值
static int endValue = 100; //题目要求,可以改为别的数,5的倍数就行
static Object obj = new Object(); //锁对象
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
int target = i;
new Thread(new Runnable() {
@Override
public void run() {
startPrint(target);
}
}, "线程" + i).start();
}
}
public static void startPrint(int targetFlag) {
while (num <= endValue) {
synchronized (obj) {
if (flag != targetFlag) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.print(Thread.currentThread().getName() + ":");
for (int i = 1; i <= 5; i++) {
System.out.print(num + " ");
num++;
}
//换行
System.out.println();
flag++;
if (flag > 3) {
flag = 1;
}
obj.notifyAll();
}
}
}
}
}
运行结果: