线程池学习简单笔记

来源:互联网 发布:金山wps office mac版 编辑:程序博客网 时间:2024/05/06 23:11

线程池三个优点

 1 节省内存消耗 重复利用已经创建的线程( 线程的创建与销毁都要消耗系统资源) 2 提供响应速度 利用创建好的线程执行任务 无需等待线程重新创建 3 提高线程的可管理性

一个任务提交给线程池之后处理流程

任务提交上来------> 线程池先判断线程池大小是否达到corePoolSize----->如果线程池大小没达到corePoolSize则创建新的线程来执行该任务------>———如果workQueue已满则判断线程池大小是否达到maximumPoolSize--------》如果没有达到maximumPoolSize则创建新线程执行workQueue里的任务------》如果达到maximumPoolSize则执行拒绝策略RejectedExecutionHandler

线程池操作

开启线程池

    1、execute()执行Ruannable类型的任务    2、submit():可用来提交Callable或Runnable任务,并返回代表此任务的Future对象

关闭线程池

    1、shutdown()在完成已提交的任务后封闭办事,不再接管新任务    2、shutdownNow()停止所有正在履行的任务并封闭办事。   通常调用shutdown方法来关闭线程池,如果任务不一定要执行完,则可以调用shutdownNow方法

其他方法

    isTerminated():测试是否所有任务都履行完毕了。    BlockingQueue<Runnable> getQueue()获取阻塞队列    getPoolSize() 获取线程池的大小    getCorePoolSize()获取核心线程数    getActiveCount()获取正在执行任务的个数

如何创建线程池

创建线程池有两种方式 一个是new ThreadPoolExecutor  一个是用Executors提供的api创建

ThreadPoolExecutor

  构造方法 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit   unit,BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)     corePoolSize 线程池维护线程的最少数量      maximumPoolSize 线程池维护线程的最大数量      keepAliveTime 线程池维护线程所允许的空闲时间      workQueue  工作队列      threadFactory 线程创建工厂      handler     线程池对拒绝任务的处理策略

阻塞式队列

  LinkedBlockingQueue 无界阻塞式队列(过多请求 后面加入的任务等待时间过长有时限的任务会失败)  系统的过载保护)  PriorityBlockingQueue 带优先级的无界阻塞队列 阻塞式队列的插入操作    add():加一个线程到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则报异常     offer():将线程加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false.     put():将线程加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续,处于一直阻塞的状态阻塞式队列的移除操作    remove()方法直接删除队头的元素:    pool()方法取出并删除队头的元素,当队列为空,返回null;    take()方法取出并删除队头的元素,当队列为空,则会一直等待直到队列有新元素可以取出,或者线程被中断抛出异常

Executors

1:创建固定个数的线程数,    ExecutorService executorService = Executors.newFixedThreadPool(5);2:创建单个线程数:    ExecutorService executorService = Executors.newSingleThreadExecutor()3:创建带缓存的线程池    ExecutorService executorService = Executors.newCachedThreadPool();当然Executors还可以创建定时调度的线程池4:Executors.newScheduledThreadPool(5);    这个返回的是ScheduledExecutorService对象,它继承了ExecutorService接口,ScheduledExecutorService适用于需要多个后台线程    执行周期任务,同时为了满足资源管理的需求而需要限制后台线程的数量的应用场景.5、单任务延迟连接池    Executors.newSingleThreadScheduledExecutor();

Executors.newFixedThreadPool(5);

 public static ExecutorService newFixedThreadPool(int nThreads) {         return new ThreadPoolExecutor(nThreads, nThreads,                                       0L, TimeUnit.MILLISECONDS,                                     new LinkedBlockingQueue<Runnable>());        }  
FixedThreadPool线程池使用的队列是LinkedBlockingQueue,而且keepAliveTime设置为0L,也就是线程执行完任务立即回收

Executors.newSingleThreadExecutor()

public static ExecutorService newSingleThreadExecutor() {         return new FinalizableDelegatedExecutorService             (new ThreadPoolExecutor(1, 1,                                     0L, TimeUnit.MILLISECONDS,                                     new LinkedBlockingQueue<Runnable>()))
 SingleThreadExecutor的corePoolSize和maximumpoolSize都设置为1了 都用LinkedBlockingQueue。其原理是一个线程轮询的去 判断workQueue是否等于1,不等于1就从队列中去取一个线程来执行,

Executors.newCachedThreadPool()

public static ExecutorService newCachedThreadPool() {         return new ThreadPoolExecutor(0, Integer.MAX_VALUE,                                       60L, TimeUnit.SECONDS,                                       new SynchronousQueue<Runnable>());     } 
KeepAliveTime设置为60L 线程池中的空闲线程可以等待新任务的最长时间为60秒,maximumPoolSize被设置为Integer.MAX_VALUE,即maximumPoolSize是无界的
0 0
原创粉丝点击