Java 线程池是一种执行器(Executor),用于在一个后台线程中执行任务。线程池的主要目的是减少在创建和销毁线程时所产生的性能开销。通过重用已经创建的线程来执行新的任务,线程池提高了程序的响应速度,并且提供了更好的系统资源管理。
以下是 Java 线程池的一些基本使用方法:
创建线程池:
Java 提供了Executors
工厂类来创建不同类型的线程池。// 创建一个固定大小的线程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4); // 创建一个可缓存的线程池,它会根据需要创建新线程 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // 创建一个单线程的执行器 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); // 创建一个定时以及周期性任务的线程池 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
提交任务给线程池:
提交
Runnable
任务:fixedThreadPool.execute(new Runnable() { public void run() { // 任务代码 } });
提交
Callable
任务,并获取Future
对象:Callable<String> callable = new Callable<String>() { public String call() throws Exception { return "任务结果"; } }; Future<String> future = fixedThreadPool.submit(callable); String result = future.get(); // 获取任务结果
关闭线程池:
平滑关闭线程池,执行已提交的任务,不接受新任务:
fixedThreadPool.shutdown();
尝试立即停止所有正在执行的任务,暂停处理等待的任务,并返回等待执行的任务列表:
List<Runnable> notExecutedTasks = fixedThreadPool.shutdownNow();
等待线程池终止:
在调用
shutdown
方法后,可以调用awaitTermination
方法等待所有任务完成:fixedThreadPool.shutdown(); try { if (!fixedThreadPool.awaitTermination(60, TimeUnit.SECONDS)) { fixedThreadPool.shutdownNow(); } } catch (InterruptedException e) { fixedThreadPool.shutdownNow(); }
自定义线程池:
可以通过构造函数自定义线程池的参数:
int corePoolSize = 4; int maximumPoolSize = 10; long keepAliveTime = 120; TimeUnit unit = TimeUnit.SECONDS; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ExecutorService customThreadPool = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler );
处理拒绝的任务:
可以通过实现
RejectedExecutionHandler
接口来处理当任务被拒绝时的行为:class MyRejectedExecutionHandler implements RejectedExecutionHandler { public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { // 处理拒绝任务的逻辑 } }
监控线程池:
可以通过
ThreadPoolExecutor
提供的方法来监控线程池的状态:long activeCount = customThreadPool.getActiveCount(); long taskCount = customThreadPool.getTaskCount();
使用线程池时,应该根据应用程序的实际需求来选择合适的线程池类型和参数,以确保资源的有效利用和应用程序的性能。同时,合理地关闭线程池也是非常重要的,以避免资源泄露。