Java线程池之FutureTask【Java线程池系列3】

简介: Java线程池之FutureTask【Java线程池系列3】在附录的文章2中,使用了Java的线程池和Future、Callable。


Java线程池之FutureTask【Java线程池系列3】

在附录的文章2中,使用了Java的线程池和Future、Callable。本篇文章在文章2的基础上加以改进,基于FutureTask,换掉Future重新实现。
FutureTask既实现了Future,也实现了Runnable,所以更加的普适,用法和Future相类似。和附录的文章2代码写法类似,比如:

package test_java;

import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class ZhangPhilExecutorService {

	private final int POOL_SIZE = 5;
	private final int TOTAL_THREAD = 6;

	public ZhangPhilExecutorService() {

		// 创建容量为 POOL_SIZE 的线程池。
		ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE);

		final ArrayList<FutureTask<String>> futures = new ArrayList<FutureTask<String>>();

		for (int i = 0; i < TOTAL_THREAD; i++) {

			AThread t = new AThread(i);

			//在此处使用FutureTask实现,注意写法
			FutureTask<String> futureTask = new FutureTask<String>(t);
			futures.add(futureTask);
			pool.submit(futureTask);
		}

		System.out.println("获取结果中...");
		for (FutureTask<String> f : futures) {
			try {
				// if (f.isDone())
					System.out.println(f.get());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println("得到全部结果.");

		// 关闭线程池。
		pool.shutdown();
	}

	private class AThread implements Callable<String> {

		private int id;

		public AThread(int id) {
			this.id = id;
		}

		@Override
		public String call() {
			System.out.println("线程:" + id + " -> 运行...");
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("线程:" + id + " -> 结束");
			return "返回的字符串" + id;
		}
	}

	public static void main(String[] args) {
		new ZhangPhilExecutorService();
	}
}

注意,FutureTask和Future在get返回值时候,都将阻塞,所以,为了避免阻塞,可以加一条判断语句isDone,完成了才get,否则不予get。另外,FutureTask还有Future在get的时候,还有一个相类似的方法体:
public V get(long timeout,TimeUnit unit);
可以设置超时时间,那么在get时候如果超时则返回,从另外一个途径实现非阻塞获取返回数据。


附录我以前写的相关文章:
【文章1】《Java线程池:ExecutorService,Executors》链接地址:http://blog.csdn.net/zhangphil/article/details/43898637
【文章2】《Java线程池及Future、Callable获得线程返回结果【Java线程池系列2】》链接地址:http://blog.csdn.net/zhangphil/article/details/49701219

相关文章
|
9天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
26 2
|
2天前
|
Java 数据库 UED
Java的多线程有什么用
Java的多线程技术广泛应用于提升程序性能和用户体验,具体包括:提高性能,通过并行执行充分利用多核CPU;保持响应性,使用户界面在执行耗时操作时仍流畅交互;资源共享,多个线程共享同一内存空间以协同工作;并发处理,高效管理多个客户端请求;定时任务,利用`ScheduledExecutorService`实现周期性操作;任务分解,将大任务拆分以加速计算。多线程尤其适用于高并发和并行处理场景。
|
11天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
8天前
|
Java
JAVA并发编程系列(13)Future、FutureTask异步小王子
本文详细解析了Future及其相关类FutureTask的工作原理与应用场景。首先介绍了Future的基本概念和接口方法,强调其异步计算特性。接着通过FutureTask实现了一个模拟外卖订单处理的示例,展示了如何并发查询外卖信息并汇总结果。最后深入分析了FutureTask的源码,包括其内部状态转换机制及关键方法的实现原理。通过本文,读者可以全面理解Future在并发编程中的作用及其实现细节。
|
9天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
7 0
|
11天前
|
Java 数据处理 调度
Java中的多线程编程:从基础到实践
本文深入探讨了Java中多线程编程的基本概念、实现方式及其在实际项目中的应用。首先,我们将了解什么是线程以及为何需要多线程编程。接着,文章将详细介绍如何在Java中创建和管理线程,包括继承Thread类、实现Runnable接口以及使用Executor框架等方法。此外,我们还将讨论线程同步和通信的问题,如互斥锁、信号量、条件变量等。最后,通过具体的示例展示了如何在实际项目中有效地利用多线程提高程序的性能和响应能力。
|
12天前
|
安全 算法 Java
Java中的多线程编程:从基础到高级应用
本文深入探讨了Java中的多线程编程,从最基础的概念入手,逐步引导读者了解并掌握多线程开发的核心技术。无论是初学者还是有一定经验的开发者,都能从中获益。通过实例和代码示例,本文详细讲解了线程的创建与管理、同步与锁机制、线程间通信以及高级并发工具等主题。此外,还讨论了多线程编程中常见的问题及其解决方案,帮助读者编写出高效、安全的多线程应用程序。
|
2月前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
66 1
|
9天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
17天前
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
83 10
spring多线程实现+合理设置最大线程数和核心线程数
下一篇
无影云桌面