美文网首页
两个线程交替打印奇偶数

两个线程交替打印奇偶数

作者: 菜猿 | 来源:发表于2019-05-05 15:27 被阅读0次

    序言

    以前看过多线程交替打印奇偶数,知道大概怎么写,实际写的时候会卡住,特此记录下来

    方法一:wait, notify,性能较差,不推荐使用

    public class TestThread {
        public static int i = 1;
    
        public static final int TOTAL = 100;
    
        public static Object lock = new Object();
    
        public static void main(String[] args) {
            Thread thread1 = new Thread(() -> {
                while (i <= TOTAL) {
                    synchronized (lock) {
                        if (i % 2 == 1) {
                            System.out.println("i=" + i++);
                            lock.notify();
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
    
            Thread thread2 = new Thread(() -> {
                while (i <= TOTAL) {
                    synchronized (lock) {
                        if (i % 2 == 0) {
                            System.out.println("i=" + i++);
                            lock.notify();
                        } else {
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
    
            thread1.start();
            thread2.start();
        }
    }
    

    方法二:countDownLatch,推荐使用

    public class TestThread2 {
        private static AtomicInteger num = new AtomicInteger(1);
    
        private static CountDownLatch countDownLatch = new CountDownLatch(2);
    
        public static void main(String[] args) throws InterruptedException {
            Thread t1 = new Thread() {
                @Override
                public void run() {
                    while (num.intValue() < 100) {
                        if (num.intValue() % 2 == 1) {
                            System.out.println("奇数线程:"+num.intValue());
                            num.incrementAndGet();
                        }
                        countDownLatch.countDown();
                    }
                }
            };
    
            Thread t2 = new Thread() {
                @Override
                public void run() {
                    while (num.intValue() <= 100) {
                        if (num.intValue() % 2 == 0) {
                            System.out.println("偶数线程:"+num.intValue());
                            num.incrementAndGet();
                        }
                        countDownLatch.countDown();
                    }
                }
            };
    
            t1.start();
            t2.start();
            countDownLatch.await();
        }
    }
    

    相关文章

      网友评论

          本文标题:两个线程交替打印奇偶数

          本文链接:https://www.haomeiwen.com/subject/asncoqtx.html