IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 自定义线程池 -> 正文阅读

[开发工具]自定义线程池

线程池大家都会,再不济用executors直接生成,但是使用线程池时候有一些痛点

1、线程抛异常,线程讲死掉,线程池新建一个线程,而异常被线程池吃掉了,外部感知不到

2、我们可能有需要对线程的各个状态时候执行一些操作,比如完成时,异常时

3、有时候我们不希望进入阻塞队列,希望有线程就执行没线程就等待到有线程为止

public class ThreadPoolExecutorWrapper {
    private ThreadPoolExecutor threadPoolExecutor;

    public static ThreadPoolExecutorWrapper buildBlockTPWithTimeout(int corePoolSize,
                                                                    int maximumPoolSize, long timeout, TimeUnit unit) {
        return build(corePoolSize, maximumPoolSize, 100, TimeUnit.MILLISECONDS, new SynchronousQueue<>(), Executors.defaultThreadFactory(), (r, executor) -> {
            try {
                executor.getQueue().offer(r, timeout, unit);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    public static ThreadPoolExecutorWrapper buildBlockTP(int corePoolSize,
                                                         int maximumPoolSize) {
        return build(corePoolSize, maximumPoolSize, 100, TimeUnit.MILLISECONDS, new SynchronousQueue<>(), Executors.defaultThreadFactory(), (r, executor) -> {
            try {
                executor.getQueue().put(r);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }

    public static ThreadPoolExecutorWrapper build(int corePoolSize,
                                                  int maximumPoolSize,
                                                  long keepAliveTime,
                                                  TimeUnit unit,
                                                  BlockingQueue<Runnable> workQueue,
                                                  ThreadFactory threadFactory,
                                                  RejectedExecutionHandler handler) {
        ThreadPoolExecutorWrapper threadPoolExecutorWrapper = new ThreadPoolExecutorWrapper();
        threadPoolExecutorWrapper.threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
        return threadPoolExecutorWrapper;
    }

    public void execute(Runnable command) {
        execute(command, null, null);
    }

    public void execute(Runnable command, Runnable doneHandle) {
        execute(command, doneHandle, null);
    }

    public void execute(Runnable command, Consumer<Throwable> exceptionHandle) {
        execute(command, null, exceptionHandle);
    }

    public void execute(Runnable command, Runnable doneHandle, Consumer<Throwable> exceptionHandle) {
        FutureTaskWrapper<?> ft = new FutureTaskWrapper<>(command, doneHandle, exceptionHandle);
        threadPoolExecutor.execute(ft);
    }

    public <V> FutureTaskWrapper<V> submit(Callable<V> callable) {
        return submit(callable, null, null);
    }

    public <V> FutureTaskWrapper<V> submit(Callable<V> callable, Runnable doneHandle) {
        return submit(callable, doneHandle, null);
    }

    public <V> FutureTaskWrapper<V> submit(Callable<V> callable, Consumer<Throwable> exceptionHandle) {
        return submit(callable, null, exceptionHandle);
    }

    public <V> FutureTaskWrapper<V> submit(Callable<V> callable, Runnable doneHandle, Consumer<Throwable> exceptionHandle) {
        FutureTaskWrapper<V> ft = new FutureTaskWrapper<>(callable, doneHandle, exceptionHandle);
        threadPoolExecutor.submit(ft);
        return ft;
    }
}
public class FutureTaskWrapper<V> extends FutureTask<V> {
    private Runnable doneHandle;
    private Consumer<Throwable> exceptionHandle;

    public FutureTaskWrapper(Callable<V> callable) {
        this(callable, null, null);
    }

    public FutureTaskWrapper(Runnable runnable) {
        this(runnable, null, null);
    }

    public FutureTaskWrapper(Callable<V> callable, Runnable doneHandle, Consumer<Throwable> exceptionHandle) {
        super(callable);
        this.doneHandle = doneHandle;
        this.exceptionHandle = Objects.nonNull(exceptionHandle) ? exceptionHandle : throwable -> {
            throw new RuntimeException(throwable);
        };
    }

    public FutureTaskWrapper(Runnable runnable, Runnable doneHandle, Consumer<Throwable> exceptionHandle) {
        super(runnable, null);
        this.doneHandle = doneHandle;
        this.exceptionHandle = exceptionHandle;
    }

    @Override
    protected void done() {
        if (Objects.isNull(doneHandle)) return;
        doneHandle.run();
    }

    @Override
    protected void setException(Throwable t) {
        super.setException(t);

        if (Objects.isNull(exceptionHandle)) return;
        exceptionHandle.accept(t);
    }

    @Override
    public V get() throws InterruptedException {
        try {
            return super.get();
        } catch (ExecutionException ignored) {

        }

        return null;
    }

    @Override
    public V get(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
        try {
            return super.get(timeout, unit);
        } catch (ExecutionException ignored) {

        }

        return null;
    }

    public Runnable getDoneHandle() {
        return doneHandle;
    }

    public void setDoneHandle(Runnable doneHandle) {
        this.doneHandle = doneHandle;
    }

    public Consumer<Throwable> getExceptionHandle() {
        return exceptionHandle;
    }

    public void setExceptionHandle(Consumer<Throwable> exceptionHandle) {
        this.exceptionHandle = exceptionHandle;
    }
}

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:58:27  更:2022-04-26 12:00:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:51:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码