All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.core.thread.BlockPolicy Maven / Gradle / Ivy

There is a newer version: 5.8.33
Show newest version
package cn.hutool.core.thread;

import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.function.Consumer;

/**
 * 当任务队列过长时处于阻塞状态,直到添加到队列中
 * 如果阻塞过程中被中断,就会抛出{@link InterruptedException}异常
* 有时候在线程池内访问第三方接口,只希望固定并发数去访问,并且不希望丢弃任务时使用此策略,队列满的时候会处于阻塞状态(例如刷库的场景) * * @author luozongle * @since 5.8.0 */ public class BlockPolicy implements RejectedExecutionHandler { /** * 线程池关闭时,为避免任务丢失,留下处理方法 * 如果需要由调用方来运行,可以{@code new BlockPolicy(Runnable::run)} */ private final Consumer handlerwhenshutdown; /** * 构造 * * @param handlerwhenshutdown 线程池关闭后的执行策略 */ public BlockPolicy(final Consumer handlerwhenshutdown) { this.handlerwhenshutdown = handlerwhenshutdown; } /** * 构造 */ public BlockPolicy() { this(null); } @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) { // 线程池未关闭时,阻塞等待 if (false == e.isShutdown()) { try { e.getQueue().put(r); } catch (InterruptedException ex) { throw new RejectedExecutionException("Task " + r + " rejected from " + e); } } else if (null != handlerwhenshutdown) { // 当设置了关闭时候的处理 handlerwhenshutdown.accept(r); } // 线程池关闭后,丢弃任务 } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy