线程池与策略介绍

//    SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue。一般我们需要根据自己的实际业务需求选择合适的工作队列。


//1 直接提交队列: // SynchronousQueue:直接传递。对于一个好的默认的工作队列选择是SynchronousQueue,该队列传递任务到线程而不持有它们。在这一点上,试图向该队列压入一个任务,如果没有可用的线程立刻运行任务, // 那么就会入列失败,所以一个新的线程就会被创建。当处理那些内部依赖的任务集合时,这个选择可以避免锁住。 // 直接接传递通常需要无边界的最大线程数来避免新提交任务被拒绝处理。 // 当任务以平均快于被处理的速度提交到线程池时,它依次地确认无边界线程增长的可能性; //2 无界的任务队列 // LinkedBlockingQueue:无界队列可以指定初始容量大小,这个队列排列元素FIFO(先进先出)。 Integer.MAX_VALUE 没有预先定义容量的无界队列,在核心线程数都繁忙的时候会使新提交的任务在队列中等待被执行, // 所以将不会创建更多的线程,因此,最大线程数的值将不起作用。当每个任务之间是相互独立的时比较适合该队列,所以任务之间不能互相影响执行。例如,在一个WEB页面服务器, // 当平滑的出现短暂的请求爆发时这个类型的队列是非常有用的,当任务以快于平均处理速度被提交时该队列会确认无边界队列增长的可能性。 //3有界的任务队列 // ArrayBlockingQueue:有界阻塞队列,遵循FIFO原则,一旦创建容量不能改变,当向一个已经满了的该队列中添加元素和向一个已经为空的该队列取出元素都会导致阻塞; // 当线程池使用有限的最大线程数时该队列可以帮助保护资源枯竭,但它更难协调和控制。队列大小和最大线程数在性能上可以互相交换: // 使用大队列和小线程池会降低CPU使用和OS资源与上下文切换开销,但会导致人为降低吞吐量,如果任务频繁阻塞,系统的线程调度时间会超过我们的允许值; // 如果使用小队列大池,这将会使CPU较为繁忙但会出现难以接受的调度开销,这也会导致降低吞吐量 //4优先任务队列
// 优先任务队列通过PriorityBlockingQueue实现

 

           //cpu的数量

        System.out.println(Runtime.getRuntime().availableProcessors());

// 构造方法 
// Constructor and Description 
//核心线程池大小 最大线程池大小 等待时间 等待时间单位 工作队列 
// ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) 
// 创建一个新的 ThreadPoolExecutor与给定的初始参数和默认线程工厂和拒绝执行处理程序。 //核心线程池大小 最大线程池大小 等待时间 等待时间单位 工作队列 拒绝策略 // ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) // 创建一个新的 ThreadPoolExecutor与给定的初始参数和默认线程工厂。
//核心线程池大小 最大线程池大小 等待时间 等待时间单位 工作队列 线程工厂 // ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
// 创建一个新的 ThreadPoolExecutor与给定的初始参数和默认拒绝执行处理程序。 //核心线程池大小 最大线程池大小 等待时间 等待时间单位 工作队列 线程工厂 // ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) // 创建一个新 ThreadPoolExecutor给定的初始参数。
//策略 // 拒绝策略AbortPolicy:丢弃任务并抛出RejectedExecutionException // CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。 // DiscardOldestPolicy:丢弃队列中最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。 // DiscardPolicy:丢弃任务,不做任何处理。

 

AbortPolicy:直接抛出异常,这是默认策略;
CallerRunsPolicy:用调用者所在的线程来执行任务;
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
DiscardPolicy:直接丢弃任务;

  

posted @ 2021-08-04 18:09  余生请多指教ANT  阅读(183)  评论(0编辑  收藏  举报