java多线程面试知识点

这是阿里的一个面试题,原文章找不到了,题目说的是现在需要你用三个线程顺序的打印0-100的数,还要可以扩展至更多

这个题目看起来感觉很简单的,单实之不然,我们先一步一步来看题目。

一,先做一下这样一个题,两个线程分别打印奇数和偶数。

这个题目只要两个线程就可以完成了,我们可以使用notify()唤醒一个线程,和wait()关闭一个线程来解决这个题目。

    static class SoulutionTask implements Runnable {
        static int value = 0;
        @Override
        public void run() {
            while (value <= 100) {
                synchronized (SoulutionTask.class) {
                    System.out.println(Thread.currentThread().getName() + ":" + value++);
                    SoulutionTask.class.notify();
                    try {
                        SoulutionTask.class.wait();
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    new Thread(new SoulutionTask(), "偶数").start();
    new Thread(new SoulutionTask(), "奇数").start();

二,然后我们继续看一下原来的题目,有一位大神给出的答案,我是小白,但我好像发现他直接超级了100个线程,不知道说的对不对,大家看看。


class jiaoti2 implements Runnable {
    private static final Object LOCK = new Object();
    /**
     * 当前即将打印的数字
     */
    private static int current = 0;
    /**
     * 当前线程编号,从0开始
     */
    private int threadNo;
    /**
     * 线程数量
     */
    private int threadCount;
    /**
     * 打印的最大数值
     */
    private int maxInt;

    public jiaoti2(int threadNo, int threadCount, int maxInt) {
        this.threadNo = threadNo;
        this.threadCount = threadCount;
        this.maxInt = maxInt;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (LOCK) {
                // 判断是否轮到当前线程执行
                while (current % threadCount != threadNo) {
                    if (current > maxInt) {
                        break;
                    }
                    try {
                        // 如果不是,则当前线程进入wait
                        LOCK.wait();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                // 最大值跳出循环
                if (current > maxInt) {
                    break;
                }
                System.out.println("thread" + threadNo + " : " + current);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                current++;
                // 唤醒其他wait线程
                LOCK.notifyAll();
            }
        }
    }

    public static void main(String[] args) {
        int threadCount = 6;
        int max = 100;
        for (int i = 0; i < threadCount; i++) {
            new Thread(new jiaoti2(i, threadCount, max)).start();
        }
    }
}

三,最后来看看那篇文章最后给出的答案,小编觉得代码比较简洁,但是小白看不懂?

    public static void main(String[] args) throws InterruptedException{
            show();
    }

    static int result = 0;

    public static void show() throws InterruptedException {
        int N = 5;
        Thread[] threads = new Thread[N];
        final Semaphore[] syncObjects = new Semaphore[N];
        for (int i = 0; i < N; i++) {
            syncObjects[i] = new Semaphore(1);
            if (i != N - 1) {
                syncObjects[i].acquire();
            }
        }
        for (int i = 0; i < N; i++) {
            final Semaphore lastSemphore = i == 0 ? syncObjects[N - 1] : syncObjects[i - 1];
            final Semaphore curSemphore = syncObjects[i];
            final int index = i;
            threads[i] = new Thread(new Runnable() {
                public void run() {
                    try {
                        while (true) {
                            lastSemphore.acquire();
                            System.out.println("thread" + index + ": " + result++);
                            Thread.sleep(200);
                            if (result > 100) {
                                System.exit(0);
                            }
                            curSemphore.release();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
            threads[i].start();
        }
    }

 

发布了80 篇原创文章 · 获赞 32 · 访问量 3万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览