Java5后的并发革命:Executor与线程池详解

需积分: 15 0 下载量 179 浏览量 更新于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并发编程提供了强大的支持,通过线程池管理,开发者可以更有效地控制线程的并发数量,避免过多线程导致的系统资源浪费,同时简化了多线程环境下的任务调度和管理。