VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > 简明python教程 >
  • 简单看看ThreadPoolExecutor原理(2)

完成任务的线程计数器 private long completedTaskCount; //创建线程的工厂 private volatile ThreadFactory threadFactory; //饱和策略,就是当线程池中线程数量达到最大值maximumPoolSize之后采取的策略 private volatile RejectedExecutionHandler handler; //当线程池中线程数量大于规定的核心数量之后,那些线程还是空闲的,那么最多存活的时间 private volatile long keepAliveTime; //允许核心线程超时时间 private volatile boolean allowCoreThreadTimeOut; //线程池核心数量 private volatile int corePoolSize; //线程池最大线程数量 private volatile int maximumPoolSize; //默认的策略就是抛出异常,还有CallerRunsPolicy策略(使用调用者所在的线程运行任务), //DiscardOldestPolicy策略(调用poll丢弃一个任务,执行当前任务),DiscardPolicy策略,默默丢弃。不抛出异常 private static final RejectedExecutionHandler defaultHandler = new AbortPolicy();
复制代码

  

  有个内部类Worker:

复制代码
  //由这个类可知,继承了AQS,这里state==0表示锁未被获取,state==1表示创建Worker默认状态
  private final class Worker extends AbstractQueuedSynchronizer implements Runnable {
    //执行该任务的具体线程
    final Thread thread;
    //线程执行的第一个任务
    Runnable firstTask;
    //完成的任务计数
    volatile long completedTasks;
复制代码

  还有几个饱和策略的内部类分别是AbortPolicy策略(抛出异常),CallerRunsPolicy策略(使用调用者所在的线程运行任务),DiscardOldestPolicy策略(调用poll丢弃一个任务,执行当前任务),DiscardPolicy策略(默默丢弃),这些后面会说到的;

 

三.ThreadPoolExecutor简单使用

  首先我们看看线程池是怎么使用的,由最后的执行结果可知,当执行任务6的时候,线程池中线程都在使用中,而且阻塞队列已经满了,于是就出发拒绝策略去对多余任务进行处理;

复制代码
package com.example.demo.study;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import lombok.AllArgsConstructor;
import lombok.Data;

public class Study0213 {

    //这里指定任务,实现Runnable接口
    @Data
    @AllArgsConstructor
    static class MyTask implements Runnable {
        private int taskId;
        private String taskName;

        @Override
        public void run() {
            //这里没干什么,就是将任务的taskId和taskName打印出来
            System.out.println(this.toString());
        }
    }
    //实现拒绝策略,我们可以自定义处理方法,如果线程池中阻塞队列满了,就把任务怎么处理
    static class MyRejected implements RejectedExecutionHandler {
        public MyRejected() {
        }

        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            //把多余了的任务随便打印一下
            System.out.println("当前被拒绝任务为:" + r.toString());
        }
    }

    public static void main(String[] args) {
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                1, // 线程池核心线程数coreSize
                2, // 线程池最大线程数MaxSize
                60, //存活时间60  当实际超过核心线程数的线程,如果这些线程有空闲着的,那么过一段时间就会被销毁
                TimeUnit.SECONDS, //存活时间单位
                new ArrayBlockingQueue<Runnable>(3), // 有界阻塞队列
                new MyRejected()//拒绝策略
                );
        //新建五个任务
        MyTask mt1 = new MyTask(1, "任务1");
        MyTask mt2 = new MyTask(2, "任务2");
        MyTask mt3 = new MyTask(3, "任务3");
        MyTask mt4 = new MyTask(4, "任务4");
        MyTask mt5 = new MyTask(5, "任务5");
        
      



  

相关教程