JUC——线程池技术相关内容

  • 线程池相关核心参数并发

    // 阻塞队列。 private final BlockingQueue<Runnable> workQueue; // 互斥锁 private final ReentrantLock mainLock = new ReentrantLock(); // 线程集合。一个Worker对应一个线程。 private final HashSet<Worker> workers = new HashSet<Worker>(); // “终止条件”,与“mainLock”绑定。 private final Condition termination = mainLock.newCondition(); // 线程池中线程数量曾经达到过的最大值。 private int largestPoolSize; // 已完成任务数量 private long completedTaskCount; // ThreadFactory对象,用于建立线程。 private volatile ThreadFactory threadFactory; // 拒绝策略的处理句柄。 private volatile RejectedExecutionHandler handler; // 保持线程存活时间。 private volatile long keepAliveTime; //是否容许"线程在空闲状态时,仍然可以存活" private volatile boolean allowCoreThreadTimeOut; // 核心池大小 private volatile int corePoolSize; // 最大池大小 private volatile int maximumPoolSize;线程

  1. workers workers是HashSet<Work>类型,即它是一个Worker集合。而一个Worker对应一个线程,也就是说线程池经过workers包含了"一个线程集合"。当Worker对应的线程池启动时,它会执行线程池中的任务;当执行完一个任务后,它会从线程池的阻塞队列中取出一个阻塞的任务来继续运行。 wokers的做用是,线程池经过它实现了"容许多个线程同时运行"。对象

  2. workQueue workQueue是BlockingQueue类型,即它是一个阻塞队列。当线程池中的线程数超过它的容量的时候,线程会进入阻塞队列进行阻塞等待。 经过workQueue,线程池实现了阻塞功能。队列

  3. mainLock mainLock是互斥锁,经过mainLock实现了对线程池的互斥访问。it

  4. corePoolSize和maximumPoolSize corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它们的做用是调整"线程池中实际运行的线程的数量"。 例如,当新任务提交给线程池时(经过execute方法)。 -- 若是此时,线程池中运行的线程数量< corePoolSize,则建立新线程来处理请求。 -- 若是此时,线程池中运行的线程数量> corePoolSize,可是却< maximumPoolSize;则仅当阻塞队列满时才建立新线程。 若是设置的 corePoolSize 和 maximumPoolSize 相同,则建立了固定大小的线程池。若是将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则容许池适应任意数量的并发任务。在大多数状况下,核心池大小和最大池大小的值是在建立线程池设置的;可是,也能够使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 进行动态更改。io

  5. poolSize poolSize是当前线程池的实际大小,即线程池中任务的数量。thread

  6. allowCoreThreadTimeOut和keepAliveTime allowCoreThreadTimeOut表示是否容许"线程在空闲状态时,仍然可以存活";而keepAliveTime是当线程池处于空闲状态的时候,超过keepAliveTime时间以后,空闲的线程会被终止。线程池

  7. threadFactory threadFactory是ThreadFactory对象。它是一个线程工厂类,"线程池经过ThreadFactory建立线程"。请求

  8. handler handler是RejectedExecutionHandler类型。它是"线程池拒绝策略"的句柄,也就是说"当某任务添加到线程池中,而线程池拒绝该任务时,线程池会经过handler进行相应的处理"。方法

  • 拒绝策略介绍 当任务添加到线程池中之因此被拒绝,多是因为:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。

    AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。 CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。 DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,而后将被拒绝的任务添加到等待队列中。 DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

相关文章
相关标签/搜索