Java 线程池自定义拒绝策略:阻塞主线程
"Java","线程池","自定义","拒绝策略","阻塞主线程","队列满","RejectedExecutionHandler","ThreadPoolExecutor","示例代码","线程池参数","队列大小","优雅关闭","shutdown()"\n\n要自定义一个拒绝策略,你可以实现 RejectedExecutionHandler 接口,并重写 rejectedExecution 方法。在 rejectedExecution 方法中,你可以选择不同的处理方式,例如抛出异常、丢弃任务或者阻塞主线程等。\n\n以下是一个示例代码,演示如何自定义一个拒绝策略,当线程池队列满了之后,阻塞主线程等待队列空闲:\n\njava\nimport java.util.concurrent.*;\n\npublic class CustomRejectedExecutionHandler implements RejectedExecutionHandler {\n @Override\n public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {\n try {\n // 队列满了,阻塞主线程等待队列空闲\n executor.getQueue().put(r);\n } catch (InterruptedException e) {\n Thread.currentThread().interrupt();\n } \n }\n\n public static void main(String[] args) {\n // 创建线程池\n ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES,\n new ArrayBlockingQueue<>(5),\n new CustomRejectedExecutionHandler());\n\n // 提交任务到线程池\n for (int i = 0; i < 20; i++) {\n final int taskId = i;\n executor.execute(() -> {\n System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());\n try {\n Thread.sleep(1000);\n } catch (InterruptedException e) {\n Thread.currentThread().interrupt();\n }\n });\n }\n\n // 关闭线程池\n executor.shutdown();\n }\n}\n\n\n在上面的示例中,我们创建了一个线程池 ThreadPoolExecutor,设置核心线程数为5,最大线程数为10,队列大小为5。当队列满了之后,会调用 CustomRejectedExecutionHandler 的 rejectedExecution 方法,将任务放入队列中,阻塞主线程等待队列空闲。\n\n注意,在实际使用中,你可能需要根据具体需求来调整线程池的参数和队列大小。另外,executor.shutdown() 方法用于优雅地关闭线程池。
原文地址: http://www.cveoy.top/t/topic/pJCu 著作权归作者所有。请勿转载和采集!