码迷,mamicode.com
首页 > 编程语言 > 详细

java多线程题目01

时间:2019-03-27 10:51:59      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:syn   tst   start   har   als   flag   not   ber   art   

题目:两个线程交替顺序打印,一个输出正整数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();
    }
}

  

 

java多线程题目01

标签:syn   tst   start   har   als   flag   not   ber   art   

原文地址:https://www.cnblogs.com/maduar/p/10605674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!