01-Java并发体系-线程池
一、好处 1、通过重复利用已创建爱的线程降低线程创建和销毁造成的消耗:降低资源消耗 2、当任务到达时,任务可以不需要等到线程就能立即执行:提高响应速度 3、进行统一分配、调优和监控:提高线程的可管理性 ? 二、Excutor 1、Executors:静态工厂类,提供了Executor、ExecutorService、ScheduledExcutorService、ThreadFactory、Callable等类的静态工厂方法。 2、ThreadPoolExecutor》 2.1、参数含义 ①、corePoolSize:线程池中核心线程的数量 ②、maximumPoolSize:线程池中允许的最大线程数 ③、keepAliveTime:线程空闲的时间 ④、unit:keepAliveTime的单位 ⑤、workQueue:用来保存等待执行任务的阻塞队列 》使用的阻塞队列【ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue】 ⑥、threadFactory:用于设置创建线程的工厂、DefalutThreadFactory ⑦、handler:RejectedExecutionHandler,线程池的拒绝策略 》分类: 1、AbortPolicy:直接抛出异常,默认策略 2、CallerRunsPolicy:用调用者所在的线程来执行任务 3、DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务 4、DiscardPolicy:直接丢弃任务 2.2、线程池分类 2.2.1、newFixedThreadPool:可重用固定线程数的线程池 》分析: 1、corePoolSize和maximumPoolSize一致 2、使用“无界”队列LinkedBlockingQueue 3、maximumPoolSize、keepAliveTime、RejectedExecutionHandler 无效 2.2.2、newCachedThreadPool:使用单个worker线程的Executor 》分析: 1、corePoolSize和maximumPoolSize被设置为1 2、使用LinkedBlockingQueue做为workerQuue 2.2.3、newSingleThreadExecutor:会根据需要创建新线程的线程池 》分析: 1、corePoolSize被设置为0 2、maximumPoolSize被设置为Integer.MAX_VALUE 3、SynchronousQueue作为WorkerQueue 4、如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程,可能会耗尽CPU和内存资源 2.3、任务提交 2.3.1、Executor.execute() 2.3.2、ExecutorService.submit() 2.4、任务执行》执行流程 2.5、线程池调优》两种模型 2.6、线程池监控 3、ScheduledThreadPoolExecutor 3.1、继承自ThreadPoolExecutor 3.2、给定的延迟之后运行任务,或者定期执行任务 3.3、内部使用DelayQueue来实现,会把调度的任务放入DelayQueue中。DelayQueue内部封装PriorityQueue,这个PriorityQueue会对队列中的ScheduledFutureTask进行排序 ? 三、Future 异步计算 1、提供操作 1.1、执行任务的取消 1.2、查询任务是否完成 1.3、获取任务的执行结果 2、FutureTask 2.1、实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callble的返回值 2.2、内部基于AQS实现 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |