zoukankan      html  css  js  c++  java
  • 面试题:实现一个容器,提供两个方法,add,size;写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束

    主要思路是生产者消费者。当A线程打印到第5个时,让B线程的信号量加1;B线程开始执行并结束,结束前让A线程的信号量加1,A线程继续add

    import java.util.LinkedList;
    import java.util.List;
    import java.util.concurrent.Semaphore;
    
    public class TwoAddLearn {
        public static void main(String[] args) {
            Container container = new Container();
            Semaphore semaphoreA = new Semaphore(0);
            Semaphore semaphoreB = new Semaphore(0);
            ThreadA threadA = new ThreadA(container, semaphoreA, semaphoreB);
            ThreadB threadB = new ThreadB(container, semaphoreA, semaphoreB);
            threadA.start();
            threadB.start();
        }
    }
    
    class Container {
        private List<Integer> list = new LinkedList<>();
    
        public void add(Integer a) {
            list.add(a);
        }
    
        public int getSize() {
            return list.size();
        }
    }
    
    class ThreadA extends Thread {
        private Container container;
        private Semaphore semaphoreA;
        private Semaphore semaphoreB;
    
        ThreadA(Container container, Semaphore semaphoreA, Semaphore semaphoreB) {
            this.container = container;
            this.semaphoreA = semaphoreA;
            this.semaphoreB = semaphoreB;
        }
    
        @Override
        public void run() {
            super.run();
            for (int i = 1; i <= 10; i++) {
                if (container.getSize() == 5) {
                    semaphoreB.release();
                    try {
                        semaphoreA.acquire();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(i);
                container.add(i);
            }
        }
    }
    
    class ThreadB extends Thread {
        private Container container;
        private Semaphore semaphoreA;
        private Semaphore semaphoreB;
    
        ThreadB(Container container, Semaphore semaphoreA, Semaphore semaphoreB) {
            this.container = container;
            this.semaphoreA = semaphoreA;
            this.semaphoreB = semaphoreB;
        }
    
        @Override
        public void run() {
            super.run();
            try {
                semaphoreB.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("线程B结束");
            semaphoreA.release();
        }
    }

    执行结果

  • 相关阅读:
    CF 319C
    日常---区域赛临近
    poj 3728 The merchant 倍增lca求dp
    zoj 3742 Delivery 好题
    zoj 3717 Balloon 2-sat
    CF 163E. e-Government ac自动机+fail树+树状数组
    CF 335B
    hdu 4739 状压DP
    hdu 4738 桥
    Hibernate中的继承映射
  • 原文地址:https://www.cnblogs.com/billshen/p/13293515.html
Copyright © 2011-2022 走看看