笔试题:创建三个线程,第一个线程打印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线程打印;

线程相关梳理

记录一次回客科技有关线程的笔试题,三个线程加法和一个线程减法 ,延申的两个线程交替执行

从网易的一道多线程笔试题学习wait与notify来控制线程同步

for语句(含笔试题)

经典笔试题:两个线程交替打印奇偶数