package com.buaa.shortytall.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicInteger; public class GlobalMultiThreadExecutor { private static final int MAX_THREAD_NUM = 5; private static GlobalMultiThreadExecutor instance; private ExecutorService minPriorExecutorService; private ExecutorService normPriorExecutorService; private GlobalMultiThreadExecutor(){ minPriorExecutorService = Executors.newFixedThreadPool(MAX_THREAD_NUM, new MyHealthThreadFactory(Thread.MIN_PRIORITY)); normPriorExecutorService = Executors.newFixedThreadPool(MAX_THREAD_NUM, new MyHealthThreadFactory(Thread.NORM_PRIORITY)); } public static GlobalMultiThreadExecutor getInstance(){ return instance; } public void execute(Runnable runnable, int threadPriority) { if (threadPriority == Thread.MIN_PRIORITY) { minPriorExecutorService.execute(runnable); } else { normPriorExecutorService.execute(runnable); } } static { if (instance == null){ instance = new GlobalMultiThreadExecutor(); } } static class MyHealthThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; private final int priority; MyHealthThreadFactory(int priority) { this.priority = priority; group = Thread.currentThread().getThreadGroup(); namePrefix = "pool-" + priority + "-" + poolNumber.getAndIncrement() + "-thread-"; } public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != priority) t.setPriority(priority); return t; } } }