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

来源:互联网 发布:怎么用sql语句降序排列 编辑:程序博客网 时间:2024/06/06 00:41

为了避免频繁的创建和销毁线程,减少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:拒绝策略。当任务太多来不及处理时,如何拒绝任务(拒绝细节下节可讲)

原创粉丝点击