对于线程池的创建,通过查看底层源码可知,底层都是通过ThreadPoolExecutor创建不过是默认的参数不同罢了。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
1、newCachedThreadPool
newCachedThreadPool 用于创建一个缓存线程池。
ExecutorService es = Executors.newCachedThreadPool();
2、newFixedThreadPool
newFixedThreadPool 用于创建一个固定的线程数量的线程池,并将线程资源放在队列中循环使用。
ExecutorService es = Executors.newFixedThreadPool(5);
3、newScheduledThreadPool
newScheduledThreadPool 创建了一个可定时调度的线程池,可设置在给定的延迟时间后执行或者定期执行某个线程任务。
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
应该执行一个延迟三秒的线程 executorService.schedule(new Run @Override public void run() { System.out.println("1"); } },3, TimeUnit.SECONDS); 执行一个延迟一秒,每三秒执行一次的线程 executorService.scheduleAtFixedR @Override public void run() { System.out.println("1"); } },1,3,TimeUnit.SECONDS);
4、newSingleThreadExecutor
newSingleThreadExecutor 线程池会保证永远有且只有一个可用的线程,在该线程停止或者异常时,newSingleThreadExecutor 线程池会启动一个新的线程来代替该线程继续执行任务。
ExecutorService es = Executors.newSingleThreadExecutor();
5、newWorkStealingPool 创建持有足够多线程的线程池来达到快速运算的目的,在内部通过使用多个队列来减少各个线程调度产生的竞争。
ExecutorService es = Executors.newWorkStealingPool();
6、又返回值的线程池使用方式
class MyCalleb implements Callable<String>{ private String s; public MyCalleb(String s) { this.s = s; } @Override public String call() throws Exception { return s; } }
ExecutorService es = Executors.newFixedThreadPool(5);
MyCalleb mb = new MyCalleb("a"); String s = null; Future future = es.submit(mb); System.out.println(future.get().toString());