手动创建线程池+自定义拒绝策略

package com.dsfa.bi.dp.web.test.thread;

import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author Huang Zicai
 * @date 2022/11/23 19:54
 * @desc
 **/
public class MainTest {

    public static void main(String[] args) {
        List<Object> list=new ArrayList<>();

        try {
            ThreadFactory factory = new CustomizableThreadFactory("xxxxx-xxx%");
            //拒绝策略,超过线程数+队列数也添加至队列,不丢弃
            RejectedExecutionHandler rejectedExecutionHandler = (r, executor) -> {
                if (!executor.isShutdown()) {
                    try {
                        System.out.println("====================="+Thread.currentThread().getName()+":拒绝策略生效");
                        executor.getQueue().put(r);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };

            ThreadPoolExecutor executor = new ThreadPoolExecutor(
                    5,//核心线程
                    12,//最大线程
                    60,
                    TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(1024),
                    factory,
                    rejectedExecutionHandler);

            for (int i = 0; i < 50; i++) {
                //传入一个继承Thread的线程主类
                //executor.execute(new ExtendsThread());
                executor.execute(() -> {
                    System.out.println("============"+Thread.currentThread().getName()+":=====线程进入");
                    try {
                        for (int j = 0; j < 6; j++) {
                            System.out.println("============"+Thread.currentThread().getName()+":=====线程正在執行");
                            Thread.sleep(1000);
                        }
                        list.add(Thread.currentThread().getName());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                });
            }
            //System.out.println("===========================thread exec finish!");
            // 关闭线程池
            executor.shutdown();
            //executor.awaitTermination(5, TimeUnit.SECONDS)会使得线程阻塞设置的时间,再判断线程是否全部执行完成
            while (!executor.awaitTermination(5, TimeUnit.SECONDS)){
                System.out.println("============继续等待5秒");
            }
            System.out.println("===========================thread exec finish!");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            //可以收集执行过程产生的数据
            System.out.println(list.toString());
            System.out.println("++++++++++++++++++++++++thread exec finish!");

        }
    }

}

posted @ 2022-11-23 19:41  BObO-B0BO  阅读(213)  评论(0)    收藏  举报