欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程池常用几种方式

程序员文章站 2022-07-12 19:33:30
...
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * 1,直接提交队列:SynchronousQueue队列,提交的任务不会被保存,总是会马上提交执行。
 * 2,有界任务队列:ArrayBlockingQueue,有任务对时候直接创建线程,如果thread 数量大于 corePoolSize,则将新的任务加入到等待队列ArrayBlockingQueue中(有初始化大小),如果等待队列已满,则继续创建线程,如果数量 大于 maximumPoolSize,则执行拒绝策略。
 * 3,*的任务队列:LinkedBlockingQueue,线程池的任务可以无限制的添加新的任务,而线程池创建对最大线程数量就是corePoolSize的数量,此处maximumPoolSize参数无效,超出corePoolSize数量的新任务都是进入任务队列。
 * 4,优先任务队列:PriorityBlockingQueue它其实是一个特殊的*队列,线程池创建的线程数也不会超过corePoolSize的数量,只不过其他队列一般是按照先进先出的规则处理任务,而PriorityBlockingQueue队列可以自定义规则根据任务的优先级顺序先后执行
 * @Description: 
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午2:28:20
 */
public class ThreadPool1 {

    private static ThreadPoolExecutor pool;

    public static void main(String[] args) {
        /**
         * int corePoolSize, 指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;
         * int maximumPoolSize, 指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;
         * long keepAliveTime, 当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;
         * TimeUnit unit, 
         * BlockingQueue<Runnable> workQueue, 任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、*任务队列、优先任务队列几种;
         * ThreadFactory threadFactory, 线程工厂,用于创建线程,一般用默认即可;
         * RejectedExecutionHandler handler, 拒绝策略;当任务太多来不及处理时,如何拒绝任务;
         */
        
        // maximumPoolSize设置为2 ,拒绝策略为AbortPolic策略,直接抛出异常
        /**
         * 第一种
         */
        //  pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(),
        //  Executors.defaultThreadFactory(), new MyRejectedExecutionHandler());
        /**
         * 第二种
         * ArrayBlockingQueue,初始容量5
         */
        pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        
        /**
         * 第三种
         */
        //   pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
        //   Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 3; i++) {
            pool.execute(new ThreadTask());
        }
    }
}

class ThreadTask implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

/**
 * @Description: 拒绝策略,直接调用当前调用者线程资源 来执行run方法
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午4:34:27
 */
class MyRejectedExecutionHandler implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // TODO Auto-generated method stub
       System.out.println("拒绝策略);
       r.run();
    }
}
相关标签: thread