天天看點

Thread-per-Message模式

  1. 目的:就是每來一個請求, 為這個請求建立一個線程來執行此請求。進而保證程式不會被堵塞。
public class Message {

    private final String data;

    public Message(String data) {        
    	this.data = data;
    }
    
    public String getData() {
        return data;
    }
}



/**
 * 當任務請求的時候, 開辟線程執行任務; 保證程式不會因為執行任務, 而阻塞.
 */
public class MessageHandler {
    private final Random random = new Random(System.currentTimeMillis());

    private final Executor executor = Executors.newFixedThreadPool(5);

    public void request(Message message) {        executor.execute(() -> {
            String data = message.getData();

            System.out.println(Thread.currentThread().getName() + " :: " + data);
            try {                
            	Thread.sleep(random.nextInt(100));
            } catch (InterruptedException e) {                
            	e.printStackTrace();
            }        
        });
    }
    
    // 關閉線程池
    public void shutDown() {       
    	 ((ExecutorService)executor).shutdown();
    }

}


public class MessageHandlerDemo {
    public static void main(String[] args) {
        MessageHandler handler = new MessageHandler();

        IntStream.rangeClosed(1, 10).forEach(i -> {            
        	handler.request(new Message(String.valueOf(i)));
        });

        System.out.println("關閉線程池");
        // 不會立即關閉線程池, 而是等待線程池中的任務執行完成.
        handler.shutDown();
    }
}