利用google的guava完成线程通信

利用google的guava完成线程通信_第1张图片

搭建环境:IDEA,JDK8,guava-23.0.jar

定义缓冲区(使用链表)

private LinkedList buffer = new LinkedList<>();

定义缓冲区大小

private static final int max = 10;

记录生产标号,从0开始

不使用int i;i++,因为它不是一个原子性操作,会被拆分成多个,可能会出现线程安全问题
private static AtomicInteger count = new AtomicInteger(0);

创建monitor对象

private Monitor monitor = new Monitor();

创建生产者方法
  private void produce(int value){
      try {  
          *使用lambda函数,判断缓冲区的大小*
          monitor.enterWhen(monitor.newGuard(() -> buffer.size() < 10));  
          *加在缓冲区的最后(先进先出)*
          buffer.addLast(value);  
      } catch (InterruptedException e) {  
          e.printStackTrace();  
      }finally {  
          *线程解除*
          monitor.leave();  
          System.out.println("生产成功,缓冲区大小:"+buffer.size());  
      }  
  }
创建消费者方法
    private int consume(){  
        try {  
            *当缓冲区的大小不为零,就从里面获取一个值*
            monitor.enterWhen(monitor.newGuard(()-> ! buffer.isEmpty()));  
            return buffer.removeFirst();  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
            throw new RuntimeException(e);  
        }finally {  
            monitor.leave();  
            System.out.println("消费成功,缓冲区大小:"+buffer.size());  
        }  
}

在主方法中调用

MonitorDemo demo = new MonitorDemo();  
ExecutorService executorService = Executors.newFixedThreadPool(6);  
//将线程池包装  
ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
调用生产者方法

加入三个生产者

for (int i = 0;i < 3;i ++){  
    listeningExecutorService.submit(()->{  
        while (true){  
            int result = count.getAndIncrement();  
            demo.produce(result);  
            System.out.println("生产了:"+result);  
        }  
  
    });  
}
调用消费者方法

加入三个消费者

for (int i = 0;i < 3; i ++){  
    listeningExecutorService.submit(()->{  
        while(true){  
            int result = demo.consume();  
            System.out.println("消费:"+result);  
        }  
  
    });  
}

总结:在平常面试中,可能会遇到线程通信的笔试题,我们如何在众多的求职者中脱颖而出,让面试官眼前一亮,这就需要我们在平时多积累,使用非常规的方法,让面试官记住你!!!,最后在这里,我祝愿各位求职者在求职过程中,都能取得各位心仪的offer,

你可能感兴趣的:(java)