性能优化中,其中一块是线程池的使用,初探线程池,从简单了解到源码分析,深入理解才能合理运用。
(一)线程池的来源及优点
单个异步任务,每次都需创建线程、销毁线程,当任务处理的时间短而请求数却巨大时,将导致资源消耗过多。
比如,数据库连接,需消耗大量资源,建立线程池能重用数据库访问线程。
使用线程池的优点:
1.降低资源消耗。重用现有线程,减少线程创建销毁开销。
2.提高响应速度。任务启动,无需经历线程创建,速度提升。
3.线程控制性强。如定时、定期、单线程设置等。
(二)线程池类别
四种线程池类型:
1.newCachedThreadPool
有缓存的线程池,适用于大量短期任务
2.newFixedThreadPool
定长的线程池,可控制最大线程并发数
3.newScheduledThreadPool
定长的线程池,可定时和周期性执行线程
4.newSingleThreadExecutor
单线程的线程池,保证所有任务按顺序执行
(三)线程池类别实例分析
1.newCachedThreadPool
private void newCacheThreadPool() { ExecutorService threadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { final int index = i; try { if (i == 1 || i == 3) { Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } threadPool.execute(new Runnable() { @Override public void run() { System.out.println("new cached thread pool " + index + ":" + Thread.currentThread().getId()); } }); } }运行结果:
new cached thread pool 0:9 new cached thread pool 1:9 new cached thread pool 2:10 new cached thread pool 3:10 new cached thread pool 4:9例子分析:因为1和3线程休息了一下,等待其他线程执行完,所以重用了旧有的线程。
2.newFixedThreadPool
private void newFixedThreadPool() { ExecutorService threadPool = Executors.newFixedThreadPool(2); for (int i = 0; i < 5; i++) { final int index = i; threadPool.execute(new Runnable() { @Override public void run() { System.out.println("new fixed thread pool " + index + ":" + Thread.currentThread().getId()); } }); } }运行结果:
new fixed thread pool 0:9 new fixed thread pool 1:10 new fixed thread pool 2:9 new fixed thread pool 4:9 new fixed thread pool 3:10例子分析:定长为2,其他线程进入队列,等待前俩线程执行完才运行。
3.newScheduledThreadPool
private void newScheduledThreadPool() { ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } threadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("new scheduled thread pool :" + Thread.currentThread().getId()); } }, 1, 3, TimeUnit.SECONDS); }运行结果:
new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9 new scheduled thread pool :9例子分析:延迟1秒开始,每隔3秒运行一次。
4.newSingleThreadExecutor
private void newSingleThreadPool() { ExecutorService threadPool = Executors.newSingleThreadExecutor(); for (int i = 0; i < 5; i++) { final int index = i; threadPool.execute(new Runnable() { @Override public void run() { System.out.println("new single thread pool " + index + ":" + Thread.currentThread().getId()); } }); } }运行结果:
new single thread pool 0:9 new single thread pool 1:9 new single thread pool 2:9 new single thread pool 3:9 new single thread pool 4:9例子分析:只有单线程,所以,每次只能执行一个线程,其余任务等待状态。
线程池源码分析请看java-线程池(二)