1. 程式人生 > 實用技巧 >自定義執行緒池

自定義執行緒池

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class ProducerConsumer {
    private final static Logger logger = LoggerFactory.getLogger(ProducerConsumer.class
); /** * 球的容器(原始的) */ private static List<String> balls = new ArrayList<>(15); private static ConcurrentLinkedQueue<String> ballsEx = new ConcurrentLinkedQueue<String>(); /** * 球的容器(處理過的) */ private static List<String> ballsDone = new
ArrayList<>(15); /** * 通過自定義ThreadFactory設定執行緒的名稱; (便於在除錯的時候識別它們) */ static class RobotMainThreadFactory implements ThreadFactory { private AtomicInteger count = new AtomicInteger(0); @Override public Thread newThread(Runnable r) { Thread t
= new Thread(r); String threadName = "moveball_" + count.addAndGet(1); t.setName(threadName); return t; } } /** 任務執行緒池 **/ private static ThreadPoolExecutor threadPool = null; private static void createThreadPool(){ int maximumPoolSize = 5; threadPool = new ThreadPoolExecutor(maximumPoolSize, maximumPoolSize, 24L, TimeUnit.HOURS, new ArrayBlockingQueue<Runnable>(maximumPoolSize + 2), new RobotMainThreadFactory()); RejectedExecutionHandler handler = new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { logger.error("主執行緒池已滿, 無法新增任務: " + r.toString()); } }; threadPool.setRejectedExecutionHandler(handler); logger.info("成功建立執行緒池 robotMainThreadPool."); } public static void main(String[] args) throws InterruptedException { balls.add("aa"); balls.add("bb"); balls.add("cc"); balls.add("dd"); balls.add("ee"); balls.add("ff"); balls.add("gg"); balls.add("hh"); balls.add("ii"); createThreadPool(); for(int i=0; i <= 4; i++) { Runnable task = new Runnable() { @Override public void run() { while (balls.size() != 0) { String oneBall = ""; ballsEx.poll(); synchronized (balls) { oneBall = balls.get(0); balls.remove(0); } if(oneBall.length() == 0) { break; } logger.info("我在搬運小球:" + oneBall); synchronized (ballsDone) { ballsDone.add(oneBall); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; threadPool.execute(task); } Thread.sleep(5000); System.out.println(balls.size() + " , " + ballsDone.size()); } }