importcn.hutool.core.thread.ThreadFactoryBuilder; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importjava.util.concurrent.*; publicenumThreadPoolSingleton { /*** 线程池实例*/INSTANCE; privatefinalThreadPoolExecutorexecutor; privatefinalLoggerlogger=LoggerFactory.getLogger(ThreadPoolSingleton.class); publicThreadPoolExecutorgetInstance() { returnexecutor; } ThreadPoolSingleton() { //记录异常ThreadFactorynamedThreadFactory=ThreadFactoryBuilder.create() .setNamePrefix("admin-thread-") .setUncaughtExceptionHandler((thread, throwable) ->logger.error("ThreadPool {} got exception", thread, throwable)) .build(); //核心线程数大小finalintcorePoolSize=4; //最大线程数大小,阻塞队列占满后会在线程池中继续开启新的线程,总的线程数量不会大于最大线程数finalintmaximumPoolSize=4; //最大线程数空闲后的存活时间finallongkeepAliveTime=1L; //最大线程数空闲后的存活时间的单位finalTimeUnittimeUnit=TimeUnit.MINUTES; //阻塞队列,核心线程数占满后会把新入线程放入阻塞队列finalArrayBlockingQueue<Runnable>workQueue=newArrayBlockingQueue<>(10); //拒绝策略,最大线程数占满之后会执行此策略//由调用线程(提交任务的线程)处理该任务finalThreadPoolExecutor.CallerRunsPolicycallerRunsPolicy=newThreadPoolExecutor.CallerRunsPolicy(); //丢弃任务并抛出RejectedExecutionException异常//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.AbortPolicy();//丢弃任务,不抛异常//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.DiscardPolicy();//丢弃队列中最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务//final ThreadPoolExecutor.CallerRunsPolicy CALLER_RUNS_POLICY = new ThreadPoolExecutor.DiscardOldestPolicy();executor=newThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit, workQueue, namedThreadFactory, callerRunsPolicy); } /*** 需要获取返回值调用此方法** @Param callable* @param <T>* @return*/publicstatic<T>Future<T>submit(Callable<T>callable) { returnINSTANCE.getInstance().submit(callable); } /*** 不需要获取返回值调用此方法** @param runnable*/publicstaticvoidexecute(Runnablerunnable) { INSTANCE.getInstance().execute(runnable); } }
使用示例
获取返回值
importjava.util.concurrent.Callable; importjava.util.concurrent.ExecutionException; importjava.util.concurrent.Future; publicclassMain { publicstaticvoidmain(String[] args) { // 创建一个 Callable 任务Callable<Integer>callable=newCallable<Integer>() { publicIntegercall() throwsException { // 执行耗时操作,并返回结果returnlongRunningTask(); } }; // 提交任务并获取 Future 对象Future<Integer>future=ThreadPoolSingleton.submit(callable); try { // 阻塞等待任务执行完成并获取结果intresult=future.get(); System.out.println("任务执行结果: "+result); } catch (InterruptedException|ExecutionExceptione) { e.printStackTrace(); } } privatestaticintlongRunningTask() { // 执行耗时操作,这里假设返回一个数值return42; } }
不需要返回值
publicclassMain { publicstaticvoidmain(String[] args) { // 创建一个实现了 Runnable 接口的任务Runnablerunnable=newRunnable() { publicvoidrun() { // 执行耗时操作longRunningTask(); } }; // 提交任务ThreadPoolSingleton.execute(runnable); } privatestaticvoidlongRunningTask() { // 执行耗时操作System.out.println("任务执行中..."); } }