在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。 ### Java线程池常用方法详解 #### 一、引言 自Java 5引入并发包`java.util.concurrent`以来,线程的管理与控制变得更为高效与便捷。在这个包中,`Executor`框架成为了线程管理和调度的核心。通过`Executor`,我们可以更方便地创建线程池,并对线程进行管理。 #### 二、任务创建 任务通常由实现了`Runnable`接口的类来表示。为了创建一个任务,我们需要实现`Runnable`接口中的`run()`方法。这个方法中包含的任务逻辑将在一个新的线程中执行。 ```java class TestRunnable implements Runnable { @Override public void run() { // 任务逻辑 } } ``` #### 三、执行任务 要执行任务,我们可以通过`ExecutorService`接口提供的方法来完成。这个接口是`Executor`的一个子接口,提供了更多的线程管理功能,如任务的执行、终止等。 ##### 创建ExecutorService `java.util.concurrent.Executors`类提供了一系列静态方法用于创建不同类型的`ExecutorService`: - **newCachedThreadPool**:创建一个可根据需要创建新线程的线程池。如果线程池长度超过处理任务所需要的长度,可灵活回收空闲线程,若无可回收,则新建线程。 ```java ExecutorService executorService = Executors.newCachedThreadPool(); ``` - **newFixedThreadPool**:创建固定长度的线程池,可控制线程最大并发数,超出的线程会在队列中等待。 ```java ExecutorService executorService = Executors.newFixedThreadPool(3); ``` - **newSingleThreadExecutor**:创建单个线程的线程池,确保所有任务按照指定顺序(FIFO)执行。 ```java ExecutorService executorService = Executors.newSingleThreadExecutor(); ``` ##### 将任务添加到线程池执行 创建好线程池后,可以使用`execute(Runnable command)`方法向线程池提交任务: ```java executorService.execute(new TestRunnable()); ``` #### 四、线程池的关闭 在使用完毕后,应当关闭线程池以释放资源。这可以通过`shutdown()`或`shutdownNow()`方法来实现: - `shutdown()`:不会立即中断正在执行的任务,但不再接收新任务。当所有任务完成后,线程池会自动关闭。 ```java executorService.shutdown(); ``` - `shutdownNow()`:尝试停止所有正在执行或未开始的任务,并返回尚未执行的任务列表。 ```java List<Runnable> notRunTasks = executorService.shutdownNow(); ``` #### 五、综合实例解析 下面是一个简单的示例代码,展示了如何使用固定大小的线程池来执行任务: ```java public class TestCachedThreadPool { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i < 5; i++) { executorService.execute(new TestRunnable()); System.out.println("*************a" + i + "*************"); } executorService.shutdown(); } } class TestRunnable implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "线程被调用了。"); while (true) { try { Thread.sleep(5000); System.out.println(Thread.currentThread().getName()); } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 这段代码首先创建了一个大小为5的固定线程池,然后提交了5个任务。由于线程池大小固定为5,所以所有任务可以同时执行。每个任务都在无限循环中打印当前线程的信息。在所有任务提交后,调用`shutdown()`方法关闭线程池。 #### 六、总结 通过本文的介绍,我们可以看到Java 5及以后版本所提供的`Executor`框架极大地简化了线程的管理与控制。`ExecutorService`接口提供了一种简单有效的方式来创建、管理和关闭线程池。理解并熟练掌握这些方法对于提高程序性能和响应能力具有重要意义。

































- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 企业业务流程及信息化业务流程.ppt
- 虚拟化平台VMP安装和管理.pptx
- 对外经济贸易大学远程教育学院-计算机应用基础复习大纲.doc
- 大数据时代下高职学校会计信息化建设研究.docx
- 计算机组成原理期末复习资料王爱英.doc
- 疫情期间计算机课程在线教学组织实施探索与实践.docx
- 嵌入式工程师考试题目.doc
- 校园网络综合布线专业技术实施方案黄耀聪.doc
- 基于 YOLO 算法的行人目标检测研究与应用
- 燕山大学单片机课设方案设计书可控流水灯(c语言).doc
- 校园网络需求分析方案-案例分析.doc
- E-OTN解决方案中兴通讯:为端到端全光网络而来.docx
- 行政事业单位计算机网络安全问题及技术防范研究.docx
- 城市十字路口智能交通灯的PLC控制方案设计书.doc
- 从服务化es到kafka和redis技术实践.pptx
- 信息化背景下文书档案管理工作创新探究.docx


