Java的线程和线程池理解1:概念在Java中,线程用于异步执行任务。Java线程既是工作单元又是执行机制。从JDK5开始,工作单元与执行机制分离。工作单元包括Runnable和Callable,执行机制由Executor框架提供。二:什么是Executor框架?我们知道线程池是线程的集合,线程池对线程进行集中管理,实现线程复用,减少资源消耗,提高响应速度。线程用于执行异步任务。单个线程既是工作单元又是执行机制。从JDK1.5开始,为了将工作单元与执行机制分离,Executor框架诞生了。是统一创建和操作的接口。Executor框架实现了线程池的功能。三:Executor结构Executor框架主要由以下三部分组成。1、Task:包括要执行的任务需要实现的接口:Runnable接口或Callable接口。2、任务执行:包括任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架有两个实现ExecutorService接口的关键类(ThreadPoolExecutor和ScheduledThreadPoolExecutor)。3、异步计算的结果:包括Future接口和实现Future接口的FutureTask类。Executor框架包含的主要类和接口如下图4所示:框架的理解Executor是一个接口,它是Executor框架的基础,将任务提交和任务执行分开//我理解这是一个定义了一个线程,一个行为,任务执行,具体交给它的实现。publicinterfaceExecutor{voidexecute(Runnablecommand);}ExecutorService也是继承Executor接口扩展Executor的接口publicinterfaceExecutorServiceextendsExecutor{//停止接收新任务,原任务继续执行voidshutdown();//停止接收新任务,原任务停止执行ListshutdownNow();//接收到的参数不同Futuresubmit(Callabletask);}AbstractExecutorService是实现ExecutorService接口扩展函数的抽象类ScheduledExecutorService(延迟线程池服务)是继承ExecutorService接口扩展函数的接口线程池核心类:ThreadPoolExecutor继承AbstractExecutorService的线程池类publicclassThreadPoolExecutorextendsAbstractExecutorService{//构造方法//corePoolSize核心线程指定线程池中的线程数,它的个数决定了添加的任务是开辟新的线程来去执行,或者放到workQueue任务队列中;//maximumPoolSize指定线程池中的最大线程数。这个参数会根据你使用的workQueue任务队列的类型来决定线程池最多开启的线程数;//keepAliveTime当线程池中的空闲线程数超过corePoolSize时,多长时间会销毁多余的线程;(空闲线程包括活动时间)//unit:keepAliveTime的单位//workQueue:任务队列,加入线程池但还未执行??;一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列;(阻塞队列长度设置为Integer.MAX_VALUE)//threadFactory:线程工厂,用于创建线程,一般使用默认;//处理程序:拒绝策略;当要处理的任务太多时,如何拒绝任务;publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,RejectedExecutionHandlerhandler){这个(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,Executors.defaultThreadFactory()core,handler);线程数为1,最大线程数为10,任务队列容量(阻塞队列)queueCapacity为BlockingQueue任务10。默认线程池数为1。当任务数不超过10时,会在任务队列中排队,在线程池中等待一个。线程处理当任务超过10个时,会新建一个线程进行处理。当线程数达到最大线程数时,RejectedExecutionHandler(任务拒绝处理器)拒绝策略RejectedExecutionHandler(拒绝策略)接口有如下实现类。如果不设置,默认为AbortPolicy,会抛出异常AbortPolicy:放弃任务,抛出运行时异常CallerRunsPolicy:执行任务DiscardOldestPolicy:将最先进入队列(最后执行)的任务从队列中踢出DiscardPolicy:忽略,什么都不会发生五:线程池的具体实现类示例:Glide的线程池实现类FifoPriorityThreadPoolExecutorFIFOpolicy线程池//FIFO线程池策略中核心线程数和最大线程数相同keepAlive,TimeUnittimeUnit,ThreadFactorythreadFactory,UncaughtThrowableStrategyuncaughtThrowableStrategy){super(corePoolSize,maximumPoolSize,keepAlive,timeUnit,newPriorityBlockingQueue(),threadFactory);}this.uncaughtThrowableStrategy=uncaughtThrowableStrategy;}}FifoPriorityThreadPoolExecutor的对应对象有sourceService和diskCacheService2个。diskCacheService的核心线程和最大线程数为1,Glide会组装成一个Engine负责EngineJob的任务管理}再由Engine组装成为GlidereturnnewGlide(engine,memoryCache,bitmapPool,context,decodeFormat);六:线程池的分类Executors工厂类中提供了各种线程池,典型的有以下四种SingleThreadExecutor单线程线程池publicstaticExecutorServicenewSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService(newThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue()));}//测试创建线程publicstaticvoidsingleThreadPool(){//创建任务Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("任务执行完毕,线程:"+Thread.currentThread().getName());}};aa.执行(可运行);}核心线程数为1,最大线程数为1,也就是说SingleThreadExecutor的线程池线程数固定为1。FixedThreadPool固定容量线程池publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnnewThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue());}//栗子:创建Thread,固定线程池publicstaticvoidfixedThreadPool(){ExecutorServiceaa=newFixedThreadPool(2);//创建任务Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("TaskisExecution,thread:"+Thread.currentThread().getName());}};aa.执行(可运行);}核心线程数为n,最大线程数为n。使用场景:指定同时执行的任务数时。CachedThreadPool缓存线程池publicstaticExecutorServicenewCachedThreadPool(){returnnewThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,newSynchronousQueue());}//栗子:缓存线程池publicstaticvoidcachedThreadPool(){ExecutorServiceaa=Executors.newCachedThreadPool();//创建任务Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("任务执行完毕,线程:"+Thread.currentThread().getName());}};aa.执行(可运行);}核心线程数为0,最大线程数无限制,线程超时时间为60秒。使用场景:处理大量时间短的任务。ScheduledThreadPool定时线程池publicstaticSc??heduledExecutorServicenewScheduledThreadPool(intcorePoolSize){returnnewScheduledThreadPoolExecutor(corePoolSize);}publicSc??heduledThreadPoolExecutor(intcorePoolSize){super(corePoolSize,Integer.MAX_VALUE,DEFAULT_KEEPALIVE_MILLIS,MILLISECONDS,newDelayedWorkQueue());}//栗子:为定时任务创建线程池publicstaticvoidscheduledThreadPool(){ExecutorServiceaa=Executors.newScheduledThreadPool(1);//创建一个任务Runnablerunnable=newRunnable(){@Overridepublicvoidrun(){System.out.println("任务执行完毕,线程:"+Thread.currentThread().getName());}};aa.执行(可运行);}核心线程数自定,最大线程数无限制。使用场景:处理延时任务