线程池及拒绝策略的基本使用

package com.xiangshuai.test;

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

/**
 * 文件在 E:(我的网盘\我的笔记)\学习文档子目录压缩\并发技术\J2SE多线程基础\线程池\线程池及拒绝策略的基本使用\Thread6Demo.java
 * @author lqx
 * 线程池的使用,只有定长的线程池才有必要做一些
 * 核心线程数,最大线程数,设置ArrayBlockingQueue这种有界队列,
 * 以及当队列满了后继续创建最大线程数又满了后,
 * new ThreadPoolExecutor.设置拒绝策略
 * 拒绝策略提供顶级接口 RejectedExecutionHandler ,其中方法 rejectedExecution 即定制具体的拒绝策略的执行逻辑。

jdk默认提供了四种拒绝策略:CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。

一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大

AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。

 DiscardPolicy - 直接丢弃,其他啥都没有

DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入
 * */
public class Thread6Demo {
     public static int count=1;
    
    public static void main(String[] args) throws InterruptedException  {
        ThreadPoolExecutor tpool = new ThreadPoolExecutor(3, 5, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(8), new ThreadPoolExecutor.CallerRunsPolicy());
         for(int i=0;i<19;i++){
             try {
                 tpool.execute(new Threadt());
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("出现异常"+count++);
            }
            
             
         }
         
    }
}


class Threadt implements Runnable{

    @Override
    public void run() {
        
        System.out.println(Thread.currentThread().getName()+"--"+Thread6Demo.count++);
         try {
             Thread.sleep(9000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    
}
 

你可能感兴趣的:(J2SE多线程基础)