常用的线程池有哪些?
1 个回答
没觉得一年比一年自由,但确实一年比一年通透。玄差Java 提供了多种类型的线程池,以满足不同的应用需求。以下是几种常用的线程池及其特点和适用场景: #### 1. `newSingleThreadExecutor` - **描述**:创建一个单线程的线程池,保证所有任务的执行顺序按照任务的提交顺序执行。 - **适用场景**:适用于需要保证任务顺序执行的场景。 - **示例**: ```java ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); ``` #### 2. `newFixedThreadPool` - **描述**:创建一个固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。达到最大线程数量后,新的任务会在队列中等待,直到有线程可用。 - **适用场景**:适用于需要限制并发线程数,控制资源使用的场景。 - **示例**: ```java ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5); ``` #### 3. `newCachedThreadPool` - **描述**:创建一个可缓存的线程池,如果线程池的大小超过了处理需求,可以灵活回收空闲线程,若无可回收的线程,则新建线程。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或 JVM)能够创建的最大线程大小。 - **适用场景**:适用于执行很多短期异步任务,或负载较轻的服务器。 - **示例**: ```java ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ``` #### 4. `newScheduledThreadPool` - **描述**:创建一个支持定时及周期性任务执行的线程池。线程池的大小可以指定。 - **适用场景**:适用于需要定时或周期性执行任务的场景。 - **示例**: ```java // 创建一个包含2个线程的调度线程池 ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2); // 1. 延迟任务:在 3 秒后执行一次性任务 scheduledExecutorService.schedule(() -> { System.out.println("任务1 - 延迟3秒后执行一次的任务:" + Thread.currentThread().getName()); }, 3, TimeUnit.SECONDS); // 2. 固定速率的周期任务:每隔 5 秒执行一次任务 scheduledExecutorService.scheduleAtFixedRate(() -> { System.out.println("任务2 - 每隔5秒执行一次:" + Thread.currentThread().getName()); }, 1, 5, TimeUnit.SECONDS); // 第一次延迟1秒,然后每隔5秒执行一次 // 3. 固定延迟的周期任务:每次执行完毕后等待 2 秒再执行下一次 scheduledExecutorService.scheduleWithFixedDelay(() -> { System.out.println("任务3 - 每次执行完后延迟2秒再执行:" + Thread.currentThread().getName()); }, 2, 2, TimeUnit.SECONDS); // 第一次延迟2秒执行,然后每次执行完后延迟2秒 // 添加关闭钩子,10秒后停止线程池 Runtime.getRuntime().addShutdownHook(new Thread(() -> { scheduledExecutorService.shutdown(); try { if (!scheduledExecutorService.awaitTermination(5, TimeUnit.SECONDS)) { scheduledExecutorService.shutdownNow(); } } catch (InterruptedException e) { scheduledExecutorService.shutdownNow(); } })); // 主线程休眠以便观察任务输出 try { Thread.sleep(10000); // 主线程休眠10秒,便于观察任务执行 } catch (InterruptedException e) { e.printStackTrace(); } // 关闭调度线程池 scheduledExecutorService.shutdown(); } ``` #### 5. `newSingleThreadScheduledExecutor` - **描述**:创建一个单线程的调度线程池,支持定时及周期性任务执行。 - **适用场景**:适用于需要单线程执行定时或周期性任务的场景,且希望保证任务顺序执行。 - **示例**: ```java ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor(); ``` ### 总结 - **`newSingleThreadExecutor`**:创建一个单线程的线程池,任务按提交顺序执行。 - **`newFixedThreadPool`**:创建一个固定大小的线程池,限制并发线程数。 - **`newCachedThreadPool`**:创建一个可缓存的线程池,线程池大小不受限制,适用于大量短期任务。 - **`newScheduledThreadPool`**:创建一个支持定时及周期性任务执行的线程池。 - **`newSingleThreadScheduledExecutor`**:创建一个单线程的调度线程池,支持定时及周期性任务执行,任务按顺序执行。 通过了解这些常用的线程池及其适用场景,可以根据具体需求选择合适的线程池类型,以提高程序的并发性能和资源利用率。编辑于 2024-11-04 15:14 •IP属地 美国举报评论收藏
公众号进入网站体验更佳

