java 线程池
Posted m4tech
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 线程池相关的知识,希望对你有一定的参考价值。
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类。
ThreadPoolExecutor extends AbstractExecutorService
构造方法属性:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler
1.Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable)返回值为void,参数为Runnable类型,就是用来执行传进去的任务的;
2.然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;
3.抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;
4.然后ThreadPoolExecutor继承了类AbstractExecutorService。
在ThreadPoolExecutor类中有几个非常重要的方法:
execute():向线程池提交一个任务,交由线程池去执行。
submit():也是用来向线程池提交任务的,能够返回任务执行的结果(利用Future)。
shutdown()和shutdownNow()是用来关闭线程池的。
执行过程:
- 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务;
- 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;
- 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;
- 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。
1 public class Test { 2 public static void main(String[] args) { 3 ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS, 4 new ArrayBlockingQueue<Runnable>(5)); 5 6 for(int i=0;i<15;i++){ 7 MyTask myTask = new MyTask(i); 8 executor.execute(myTask); 9 System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+ 10 executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount()); 11 } 12 executor.shutdown(); 13 } 14 } 15 16 17 class MyTask implements Runnable { 18 private int taskNum; 19 20 public MyTask(int num) { 21 this.taskNum = num; 22 } 23 24 @Override 25 public void run() { 26 System.out.println("正在执行task "+taskNum); 27 try { 28 Thread.currentThread().sleep(4000); 29 } catch (InterruptedException e) { 30 e.printStackTrace(); 31 } 32 System.out.println("task "+taskNum+"执行完毕"); 33 } 34 }
Java通过Executors提供四种线程池,分别为:
- newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。
- newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
public class ThreadPoolExecutorTest { public static void main(String[] args ) { ExecutorService cacheThreadPool =Executors.newCachedThreadPool(); for(int i =1;i<=5;i++){ final int index=i ; try{ Thread.sleep(1000); }catch(InterruptedException e ) { e.printStackTrace(); } cacheThreadPool.execute(new Runnable(){ @Override public void run() { System.out.println("第" +index +"个线程" +Thread.currentThread().getName()); } }); } } }
以上是关于java 线程池的主要内容,如果未能解决你的问题,请参考以下文章
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段