java多线程题目01

题目:两个线程交替顺序打印,一个输出正整数1到52,一个输出a-zA-Z,

例如 - 1a2b3c4d5e6f7g8h9i10j11k12l13m14n15o16p17q18r19s20t21u22v23w24x25y26z

27A28B29C30D31E32F33G34H35I36J37K38L39M40N41O42P43Q44R45S46T47U48V49W50X51Y52Z

 

一、使用volatile

二、使用Semaphore

三、思路: 一个线程等待,一个线程唤醒,始终只有一个线程执行

a. volatile

public class NumberDemo {
    static class Inner {
        private volatile boolean flag = true;
        private int count = 1;
        private int index = 1;

        public synchronized void printNum() {
            try {
                while (!flag) {
                    this.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print(count++);
            flag = false;
            this.notify();
        }

        public synchronized void printChar() {
            try {
                while (flag) {
                    this.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (index < 27) {
                System.out.print((char) (index + 'a' - 1));
            } else {
                System.out.print((char) (index + 'A' - 27));
            }
            index++;
            flag = true;
            this.notify();
        }
    }

    public static void main(String[] args) {
        Inner inner = new Inner();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 52; i++) {
                    inner.printNum();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 52; i++) {
                    inner.printChar();
                }
            }
        }).start();
    }
}

  b. Semaphore

public class NumberSemaphoreDemo {

    static class Inner {

        private Semaphore semaphore = new Semaphore(1);

        private int count = 1;
        private int index = 1;

        public synchronized void printNum() {
            try {
                semaphore.acquire();
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print(count++);
            semaphore.release();
            this.notify();
        }

        public synchronized void printChar() {
            try {
                semaphore.acquire();
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (index < 27) {
                System.out.print((char) (index + 'a' - 1));
            } else {
                System.out.print((char) (index + 'A' - 27));
            }
            index++;
            semaphore.release();
            this.notify();
        }
    }

    public static void main(String[] args) {
        NumberDemo.Inner inner = new NumberDemo.Inner();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 52; i++) {
                    inner.printNum();
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 52; i++) {
                    inner.printChar();
                }
            }
        }).start();
    }
}

  

 

posted @ 2019-03-27 10:15  金色元年  阅读(241)  评论(0编辑  收藏  举报