笔试题:创建三个线程,第一个线程打印1 2 3 4 5, 第二个线程打印 6 7 8 9 10...
Posted zhangjin1120
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了笔试题:创建三个线程,第一个线程打印1 2 3 4 5, 第二个线程打印 6 7 8 9 10...相关的知识,希望对你有一定的参考价值。
题目:创建三个线程,第一个线程打印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();
}
}
}
}
}
运行结果:
以上是关于笔试题:创建三个线程,第一个线程打印1 2 3 4 5, 第二个线程打印 6 7 8 9 10...的主要内容,如果未能解决你的问题,请参考以下文章
笔试题--有3个线程A/B/C,其中AB个线程轮流打印1-100 中间如果是10的倍数,则由C线程打印;
记录一次回客科技有关线程的笔试题,三个线程加法和一个线程减法 ,延申的两个线程交替执行