Java并发编程:使用Concurrent API管理线程
"Java Concurrent处理并发需求" Java 并发编程是 Java 语言的一个重要特性,它使得程序在多核或多处理器系统上可以同时执行多个线程,从而提高程序的效率和响应速度。Java 从 Java 5 开始引入了全新的并发 API(java.util.concurrent),极大地简化了并发编程,降低了线程同步的复杂性。 在提供的代码示例中,我们可以看到如何使用 `ExecutorService` 和 `Executors` 类来管理线程池并提交任务。`ExecutorService` 是一个接口,用于管理和控制任务的执行,而 `Executors` 是一个工厂类,提供了创建不同类型的 `ExecutorService` 实例的方法。在这个例子中,使用了 `newFixedThreadPool(2)` 创建了一个固定大小的线程池,该线程池有2个线程。 `submit()` 方法用于将任务提交到线程池,它可以接收 `Runnable` 或 `Callable` 对象作为参数。在这个例子中,创建了3个 `Runnable` 对象,并分别提交到线程池,每个 `Runnable` 对象代表一个任务,即 `doSomething()` 方法的调用。 `doSomething()` 方法模拟了一个耗时的操作,通过 `Thread.sleep(1000*2)` 暂停当前线程2秒。当主线程提交完所有任务后,调用 `executorService.shutdown()` 来关闭线程池,等待所有已提交的任务完成。在实际应用中,`shutdown()` 只会阻止向线程池提交新的任务,但不会立即停止正在执行的任务。 在并发环境中,`ExecutorService` 提供了一种高效且可控的方式来管理线程,避免了手动创建和管理线程的复杂性。此外,Java并发API还包括其他关键组件,如: 1. `Future`: 表示异步计算的结果,可以用来检查计算是否完成,获取结果或取消计算。 2. `Semaphore`: 信号量,用于控制同时访问特定资源的线程数量。 3. `CountDownLatch`: 计数器,允许一个或多个线程等待其他线程完成操作。 4. `CyclicBarrier`: 一个同步辅助类,允许多个线程互相等待到达一个共同的屏障点。 5. `Lock` 和 `ReentrantLock`: 提供比 `synchronized` 关键字更细粒度的锁控制,支持公平锁、非公平锁、可重入性等特性。 6. `ConcurrentHashMap`: 并发版本的哈希表,提供了在高并发环境下的高效读写操作。 7. `BlockingQueue`: 一种线程安全的数据结构,用于线程间的通信和协作。 了解和掌握这些并发工具类是编写高效、安全的多线程Java程序的关键。在处理并发需求时,应该根据具体情况选择合适的工具,以实现最佳的性能和可维护性。
3
2 java5开始,增加了concurrent api,用于并发处理。比如起多个线程并发从网络上下载图片,然后在本地显示。
这里写个简单的代码,来说明如何使用concurrent api提供的线程连接池。
运行结果类似这样:
start do 1 task …
>>main thread end.
start do 2 task …
start do 1 finished.
start do 3 task …
start do 2 finished.
start do 3 finished.
这里的task1到task3,都做的同样的事情,让它所属的线程休眠2000ms:
view sourceprint?1 private static void doSomething(int id) {
2 System.out.println("start do " + id + " task …");
3 try {
4 Thread.sleep(1000 * 2);
5 } catch (InterruptedException e) {
6 e.printStackTrace();
7 }
8 System.out.println("start do " + id + " finished.");
9 }
如果没有java自带的这个api,需要自己或者使用不标准的第三方线程池api。用concurrent api写起来很简洁:
view sourceprint?01 public static void main(String[] args) {
02 ExecutorService executorService = Executors.newFixedThreadPool(2);
03 executorService.submit(new Runnable() {
04 @Override
05 public void run() {
06 doSomething(1);
07 }
08 });
09 executorService.submit(new Runnable() {
10 @Override
11 public void run() {
12 doSomething(2);
13 }
14 });
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全