Java工具集-線程池工具

代碼示例


import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @program: simple_tools
 * @description: 線程池
 * @author: Mr.chen
 * @create: 2020-06-08 15:41
 **/
public class ThreadPool {
    /** The service. */
    private final ExecutorService service;

    private final ExecutorService singleThreadService;

    /**
     * The Class ThreadPoolHolder.
     */
    static class ThreadPoolHolder {

        /** The instance. */
        static ThreadPool instance = new ThreadPool();
    }

    /**
     * 單例構造方法.
     *
     * @return single instance of ThreadPool
     */
    public static ThreadPool getInstance() {
        return ThreadPoolHolder.instance;
    }

    /**
     * 私有構造方法
     */
    private ThreadPool() {
        // 根據處理器數量創建線程池。雖然多線程並不保證能夠提升性能,但適量地開線程一般可以從系統騙取更多資源。
        int threadNum = Runtime.getRuntime().availableProcessors() * 100;
        System.out.println(String.format("ThreadPool threadNum:%s",threadNum));
        this.singleThreadService = Executors.newFixedThreadPool(1);
        this.service = Executors.newFixedThreadPool(threadNum);
    }

    /**
     * 獲得現在隊列大小.
     *
     * @return int
     */
    public int getSize() {
        ThreadPoolExecutor pool = (ThreadPoolExecutor) service;
        return pool.getQueue().size();
    }

    /*
     *
     * 執行任務
     */
    /**
     * Execute.
     *
     * @param r
     *            the r
     */
    public void execute(Runnable r) {
        try {
            service.execute(r);
        } catch (Exception ex) {
             System.out.println("------KMV-----內部線程池異常-----------");
             ex.printStackTrace();
            // service.shutdown();
        }
        System.out.println("add task [" + r.toString() + "] ThreadPool status:" + showStatus());
    }

    /**
     *
     * @param r
     * @param isSingleThread
     *            是否以單線程的方式執行
     */
    public void execute(Runnable r, boolean isSingleThread) {
        if (!isSingleThread) {
            execute(r);
        } else {
            try {
                singleThreadService.execute(r);
            } catch (Exception ex) {
                System.out.println("------KMV-----內部線程池異常-----------");
                ex.printStackTrace();
                // service.shutdown();
            }
        }
        System.out.println("add task [" + r.toString() + "] to SingleThread ,ThreadPool status:" + showStatus());
    }

    /**
     * 打印線程池當前狀態
     */
    public String showStatus() {
        StringBuffer info = new StringBuffer();
        info.append("FixedThreadPool:");
        ThreadPoolExecutor executor = (ThreadPoolExecutor) service;
        info.append("ActiveCount:").append(executor.getActiveCount()).append(",");
        info.append("CompletedTaskCount:").append(executor.getCompletedTaskCount()).append(",");
        info.append("TaskCount:").append(executor.getTaskCount()).append(",");
        info.append("PoolSize:").append(executor.getPoolSize()).append(",");
        info.append("CorePoolSize:").append(executor.getCorePoolSize()).append(",");
        info.append("LargestPoolSize:").append(executor.getLargestPoolSize()).append(",");
        BlockingQueue<Runnable> queue = executor.getQueue();
        if (queue != null) {
            info.append("QueueSize:").append(queue.size()).append(",");
            info.append("BlockingQueue:");
            info.append("[");
            for (Runnable r : queue) {
                info.append(r);
            }
            info.append("]");
        }
        info.append("\nSingleThreadPool:");
        ThreadPoolExecutor singleExecutor = (ThreadPoolExecutor) singleThreadService;
        info.append("ActiveCount:").append(singleExecutor.getActiveCount()).append(",");
        info.append("CompletedTaskCount:").append(singleExecutor.getCompletedTaskCount()).append(",");
        info.append("TaskCount:").append(singleExecutor.getTaskCount()).append(",");
        info.append("PoolSize:").append(singleExecutor.getPoolSize()).append(",");
        info.append("CorePoolSize:").append(singleExecutor.getCorePoolSize()).append(",");
        info.append("LargestPoolSize:").append(singleExecutor.getLargestPoolSize()).append(",");
        queue = singleExecutor.getQueue();
        if (queue != null) {
            info.append("QueueSize:").append(queue.size()).append(",");
            info.append("BlockingQueue:");
            info.append("[");
            for (Runnable r : queue) {
                info.append(r);
            }
            info.append("]");
        }
        return info.toString();
    }

    /*
     *
     * 執行任務 支持執行Callable類型的任務
     */
    /**
     * Execute.
     *
     * @param r
     *            the r
     */
    @SuppressWarnings("unchecked")
    public void execute(Callable r) throws Exception {
        try {
            service.submit(r);
        } catch (Exception ex) {
            System.out.println("------KMV-----內部線程池異常-----------");
            ex.printStackTrace();
            throw ex;
            // service.shutdown();
        }
        System.out.println("add task [" + r.toString() + "] to ThreadPool status:" + showStatus());
    }

    /**
     *
     * @param r
     * @param isSingleThread
     *            是否以單線程的方式執行
     * @throws Exception
     */
    public void execute(Callable<?> r, boolean isSingleThread) throws Exception {
        if (!isSingleThread) {
            execute(r);
        } else {
            try {
                singleThreadService.submit(r);
            } catch (Exception ex) {
                System.out.println("------KMV-----內部線程池異常-----------");
                ex.printStackTrace();
                throw ex;
                // service.shutdown();
            }
            System.out.println("add task [" + r.toString() + "] to SingleThread ,ThreadPool status:" + showStatus());
        }

    }

    /**
     * Shutdown now.
     *
     * @return the list
     */
    public List<Runnable> shutdownNow() {
        ThreadPoolExecutor pool = (ThreadPoolExecutor) service;
        return pool.shutdownNow();
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章