《并发编程》--14.Java线程池和自定义线程

xiaoxiao2021-02-28  76

为了避免频繁的创建和销毁线程,减少CPU的压力,线程池就应运而生。

newFixedThreadPool()方法:该方法返回一个只有一个线程的线程池,该线程池的数量是固定始终不变。当有新任务提交时,线程池中若有空闲线程,将会立即执行。若么有空闲线程,则会被暂存在任务队列中,待有空闲线程时,才能处理任务队列的任务。

newSingleThreadExecutor()方法:该方法返回一个只有一个线程的线程池。若多余一个任务提交到线程池,会被暂存在任务队列中,待这个空闲线程时,才能处理任务队列的任务。 newCachedThreadPool()方法:该方法返回一个可以根据实际情况调整线程数据的线程池,线程池的线程数量不固定,但若有空闲线程可以复用,会优先使用可以复用的线程。若所有线程都在工作,就会创建新的线程处理任务。所有线程在当前任务中处理完毕后,将返回线程池进行复用 newSingleThreadExecutor()方法,该方法创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 newScheduledThreadPool()方法:创建一个定长线程池,支持定时及周期性任务执行。 刨根问底

无论使用哪个线程池,返回的结果不一样。但是在jdk底层都是继承了ThreadPoolExecutor。下面给出3几个线程的实现方法。jdk源码可查

public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } 总结:有时间jdk提供的线程池满足不了我们的需求,工程师也可以继承ThreadPoolExecutor来自定义线程池。

自定义线程注意以下几个参数即可。

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }

corePoolSize:指定线程池中线程的数量

maximumPoolSize:指定线程池中最大的线程数量

keepAliveTime:空闲线程的活跃时间,超过时间将会销毁

unit:keepAliveTime的单位

workQueue:任务队列,提交但还未执行的任务

ThreadFactory:线程工厂,用于创建线程。默认即可

defaultHandler:拒绝策略。当任务太多来不及处理时,如何拒绝任务(拒绝细节下节可讲)

转载请注明原文地址: https://www.6miu.com/read-27628.html

最新回复(0)