Java5后的并发革命:Executor与线程池详解
需积分: 15 59 浏览量
更新于2024-09-07
收藏 17KB DOCX 举报
"本文档主要介绍了Java5之后并发编程中的重要改进——线程池的使用,包括如何创建任务、执行任务以及如何管理和关闭线程池。线程池通过ExecutorService接口和Executors工具类提供了一种更高效、可控的线程管理方式。"
在Java5中,多线程处理的方式发生了显著变化,引入了Executor框架,使得线程的创建、管理和调度更加灵活和高效。相比直接使用Thread的start()方法启动线程,使用ExecutorService接口能够更好地控制线程的生命周期,并且利用线程池实现资源的有效复用,降低系统资源消耗。
一、创建任务
创建任务主要是实现Runnable接口或Callable接口。Runnable接口的实现类需要重写run()方法,而Callable接口则需要重写call()方法,该方法返回一个结果。例如:
```java
public class TestRunnable implements Runnable {
@Override
public void run() {
// 任务代码
}
}
```
二、执行任务
任务的执行通过ExecutorService接口实现,ExecutorService是线程池的核心接口。我们可以使用Executors工具类提供的静态方法创建ExecutorService实例:
1. `newCachedThreadPool()`:创建一个可根据需要创建新线程的线程池,如果线程池中存在空闲线程,则会重用它们。当线程池长时间无任务时,线程会自动回收。
2. `newFixedThreadPool(int nThreads)`:创建一个固定大小的线程池,它会保持nThreads个线程在池中,即使它们空闲。如果所有工作线程都被使用,新提交的任务将会等待,直到线程可用。
3. `newSingleThreadExecutor()`:创建一个单线程的Executor,它只有一个工作线程,确保所有的任务都在同一个线程中按顺序执行。
例如,创建并启动一个任务:
```java
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.execute(new TestRunnable());
```
三、线程池管理与关闭
ExecutorService提供了`shutdown()`和`shutdownNow()`方法来关闭线程池。`shutdown()`方法不会立即停止所有任务,而是不再接受新任务,待已提交的任务执行完毕后,线程池才会关闭。而`shutdownNow()`会尝试停止所有正在执行的任务,然后不再接受新任务。
四、任务的提交与Future获取
除了`execute()`方法外,ExecutorService还提供了`submit()`方法,它可以提交Callable任务并返回一个Future对象,Future对象用于查询任务状态或获取任务结果。
```java
Future<String> future = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "Task Result";
}
});
```
通过`future.get()`方法可以获取任务的返回值,但会阻塞直到任务完成。
总结来说,Java5及以后的Executor框架为Java并发编程提供了强大的支持,通过线程池管理,开发者可以更有效地控制线程的并发数量,避免过多线程导致的系统资源浪费,同时简化了多线程环境下的任务调度和管理。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2023-07-03 上传
2023-02-28 上传
2023-01-04 上传
2020-02-18 上传
2023-06-15 上传
2022-06-03 上传
starcheney
- 粉丝: 3
- 资源: 25