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 {
    }
    
  • 相关阅读:
    nodejs利用windows API读取文件属性(dll)
    nodejs调用delphi编写的dll
    Ubuntu 安装配置Jenkins
    electron将网站打包成桌面应用
    NW.js将网站打包成桌面应用
    Jenkins配置邮件SMTP(使用QQ邮箱)
    Jenkins搭建Nodejs自动化测试
    Ubuntu 安装node.js
    使用superobject 解析Json数据
    使用superobject 新建Json数据(数组)
  • 原文地址:https://www.cnblogs.com/zhuxudong/p/10171219.html
Copyright © 2011-2022 走看看