zoukankan      html  css  js  c++  java
  • 毒丸模式【其他模式】

    @Slf4j
    public class PoisonPill {
    
    	/**
    	 * 毒丸模式:生产者通过某种方式告知消费者,消息已经发送完毕,消费端将停止接收任何消息。
    	 */
    	@Test
    	public void all() throws InterruptedException {
    		final ArrayBlockingQueue<Item> queue = new ArrayBlockingQueue<>(10);
    		final Consumer<Item> consumer = new Consumer<>(queue);
    		final Producer<Item> producer = new Producer<>(queue);
    
    		CompletableFuture.runAsync(() -> {
    			try {
    				consumer.start();
    			} catch (final InterruptedException e) {
    				log.error("failed", e);
    			}
    		});
    
    		producer.produce(new User("hello"));
    		producer.produce(new User("world"));
    		producer.produce(Producer.POISON_PILL);
    		TimeUnit.SECONDS.sleep(1);
    		assertFalse(consumer.isRun());
    	}
    }
    
    class User implements Item {
    	public User(String name) {
    		super();
    	}
    }
    
    @Data
    @Slf4j
    class Consumer<T extends Item> {
    	private final BlockingQueue<T> queue;
    	private volatile boolean run = true;
    
    	public void start() throws InterruptedException {
    		while (run) {
    			final T take = queue.take();
    			if (Producer.POISON_PILL == take) {
    				stop();
    			}
    			log.info("dowork {}", take);
    		}
    	}
    
    	private void stop() {
    		run = false;
    	}
    }
    
    @Data
    class Producer<T extends Item> {
    	private final BlockingQueue<T> queue;
    	public static final Item POISON_PILL = new Item() {
    	};
    
    	public void produce(T item) throws InterruptedException {
    		queue.put(item);
    	}
    }
    
    interface Item {
    }
    
  • 相关阅读:
    delphiXE7关于android 检测屏幕是否处于关闭状态
    delphiXE7关于android API的使用和检测WIFI状态的问题
    关于Android下Delphi XE7获取通讯录的问题
    多线程操里操作webbrowser的 Frames
    关于游戏引擎
    今天博客开通了
    集合类型-集合
    编程语言
    live Python4笔记
    live Python3笔记
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10171219.html
Copyright © 2011-2022 走看看