zoukankan      html  css  js  c++  java
  • Java 线程池

    使用线程池的优点

    1. 降低资源消耗。通过反复利用已创建的线程降低创建和销毁造成的消耗。
    2. 提高响应速度。当任务到达时,任务可以不需要等到线程创建好就能立即执行。
    3. 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。

    线程池主要工作原理

    工作原理

    线程池的使用

    创建线程池

    可以通过ThreadPoolExecutor来创建一个线程池

    ThreadPoolExecutor(int corePoolSize,
                       int maximumPoolSize,
                       long keepAliveTime,
                       TimeUnit unit,
                       BlockingQueue<Runnable> workQueue,
                       ThreadFactory threadFactory,
                       RejectedExecutionHandler handler)
    
    1. corePoolSize(线程池的基本大小):当提交一个任务到线程池,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有基本线程。
    2. runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。
      • ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,按FIFO原则对元素进行排序
      • LinkedBlockingQueue:一个基于链表结构的阻塞队列,按FIFO排序元素,吞吐量通常高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
      • SynchrinousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作会一直处于阻塞状态,吞吐量通常高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
      • PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
    3. maximumPoolSize(线程池最大数量):线程池允许创建的最大线程数,如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。如果使用了无限队列,则这个参数就没有效果。
    4. ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来线程设置有意义的名字。
    new ThreadFactoryBuilder().setNameFormat("XX-task-%d").build();
    
    1. RejectedExecutorHandler(饱和策略):当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。
      • AbortPolocy:直接抛出异常(默认)
      • CallerRunsPolicy:只用调用所在线程来运行任务
      • DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务
      • DiscardPolicy:不处理,丢弃掉
    向线程池提交任务

    可以使用两个方法向线程池提交任务,分别为execute()submit()方法

    execute()方法用于提交不需要返回的任务,所以无法判断任务是否执行成功。submit()方法用于提交需要返回值的任务,线程池会返回一个future类型的对象,通过这个对象可以判断任务是否执行成功。

    关闭线程池

    可以调用线程池的shutdownshutdownNow方法来关闭线程池。

    • 相同点:它们都是通过遍历线程池中的线程,然后逐个调用线程的interrupt方法来中断线程。
    • 不同点:shutdownNow首先将线程池的状态设置成STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表,而shutdown只是将线程池的状态设置成SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

    只要调用了这两个关闭方法中的一个,isShutdown方法就会返回为true。当所有任务都已关闭后,才表示线程池关闭成功,这时调用isTerminaed方法才会返回true

  • 相关阅读:
    姐姐的vue(1)
    LeetCode 64. Minimum Path Sum 20170515
    LeetCode 56. 56. Merge Intervals 20170508
    LeetCode 26. Remove Duplicates from Sorted Array
    LeetCode 24. Swap Nodes in Pairs 20170424
    LeetCode 19. Remove Nth Node From End of List 20170417
    LeetCode No.9 Palindrome Number 20170410
    LeetCode No.8. String to Integer (atoi) 2017/4/10(补上一周)
    LeetCode No.7 Reverse Integer 2017/3/27
    LeetCode No.4 Median of Two Sorted Arrays 20170319
  • 原文地址:https://www.cnblogs.com/yuanmiemie/p/8556170.html
Copyright © 2011-2022 走看看