`

Future实例

阅读更多
package concurrent.Future;

import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
/**
 * Future会等待提交的线程执行之后获取到返回数据
 *
 */
public class FutureTest {
	public static void main(String[] args) throws Exception{
//		method1();
//		method2();
		method3();
	}
	
	public static void method1() throws Exception{
		ExecutorService pool=Executors.newFixedThreadPool(3);
		
		//使用completion提交callable时,一次提交一组callable,使用take方法来取,只要有一个任务运行完了就可以获取
		CompletionService<String> completion=new ExecutorCompletionService<String>(pool);
		
		Future<String> future=completion.submit(new Callable<String>() {
			@Override
			public String call() throws Exception {
				Thread.sleep(2000);
				return "hello";
			}
		});
		System.out.println("等待结果");
		System.out.println(future.get());
		System.out.println(completion.take().get());
	}
	
	public static void method2() throws Exception{
		ExecutorService pool=Executors.newSingleThreadExecutor();
		Future<String> future=pool.submit(new Callable<String>() {
			@Override
			public String call() throws Exception {
				Thread.sleep(2000);
				return "abcdefg";
			}
		});
		System.out.println("等待结果");
		//System.out.println(future.get());
		
		//如果1秒之内还拿不到结果,就会抛异常java.util.concurrent.TimeoutException
		System.out.println(future.get(1, TimeUnit.SECONDS));
	}
	
	/**
	 * 提交多个任务 
	 * 这里是一次提交10个任务
	 */
	public static void method3() throws Exception{
		ExecutorService pool=Executors.newFixedThreadPool(10);
		CompletionService<String> completion=new ExecutorCompletionService<String>(pool);
		for(int i=1;i<=10;i++){
			final int task=i;
			completion.submit(new Callable<String>() {
				
				@Override
				public String call() throws Exception {
					Thread.sleep(1000);
					return "我是任务:"+task;
				}
			});
		}
		for(int i=0;i<10;i++){
			System.out.println(completion.take().get());
		}
	}
}

分享到:
评论

相关推荐

    java Callable与Future的详解及实例

    Callable 和 Future 是 Java 多线程编程中的两个关键接口,它们在 Java 5 及以上版本引入,以增强并发处理的能力。Callable 接口类似 Runnable,但提供了更丰富的功能,而 Future 对象则用于管理和控制异步计算的...

    CallableFuture简介-动力节点共16页.pd

    submit()方法用于提交Callable或Runnable任务,并返回一个Future实例,这个Future对应的就是CallableFuture。 4. **Future的使用**:通过示例展示如何使用Future.get()获取结果,以及如何处理可能抛出的...

    Java使用Callable和Future创建线程操作示例

    Java使用Callable和Future创建线程操作示例主要介绍了Java使用Callable和Future创建线程操作,结合实例形式分析了java使用Callable接口和Future类创建线程的相关操作技巧与注意事项。 首先,Java 5开始,Java提供了...

    de.flapdoodle.embed.mongo-1.44.zip

    无状态未来意味着每个Future实例不保存任何内部状态,这使得它们轻量且易于管理,尤其适合于并发和并行计算。无状态Future的使用可以避免线程阻塞,提高系统的响应速度和资源利用率。当我们创建一个Future时,我们...

    Python concurrent.futures模块使用实例

    当异步任务抛出异常时,可以通过`Future`对象的`exception()`方法获取异常信息,或者在调用`result()`或`exception()`时传播异常。这有助于在并发环境中处理错误和异常。 ### 6. 关闭和取消任务 `Executor`对象有`...

    java 并发编程2

    通过ExecutorService提交Callable任务,可以获取Future实例来查询任务结果。 7. **线程池与Executor框架**:ExecutorService是Java并发编程的核心,它允许我们管理线程,控制并发级别,避免频繁创建和销毁线程的...

    java 8 APi

    `CompletableFuture`可以与其他Future实例连接,或者与lambda表达式结合使用,以实现并行任务的组合。 最后,`javafx`包在Java 8中得到了进一步加强,提供了丰富的图形用户界面(GUI)开发工具,使得开发桌面应用变...

    java 线程池与通过Future终止线程实例

    NULL 博文链接:https://waitingkkk-163-com.iteye.com/blog/2232286

    Android异步更新UI-线程池-Future-Handler实例分析

    Demo-实例讲解线程池里面的UI如何刷新,处理两个开发者头疼的问题: 1. 数据经常需要读取更新,并且比较耗时,需要分步刷新UI. 2. UI界面切换后,如何停止掉子线程里面正在读取的数据而不会将旧数据刷新到新UI界面上...

    使用future处理并发1

    通常,我们不会直接创建`Future`实例,而是通过`Executor`的`submit()`方法提交可调用对象,该方法会返回一个`Future`实例。`Future`的`.done()`方法是非阻塞的,可以检查操作是否已完成,而`.add_done_callback()`...

    swift-Future-基于微框架设计思想的异步执行及结果响应类

    4. **错误处理**:"Future" 提供了一种优雅的错误处理方式,错误可以被捕获并转化为新的"Future" 实例,允许错误的传播和处理。这比传统的try-catch结构更加灵活,也更符合函数式编程的风格。 5. **组合与并发**:...

    多线程编程之future库使用

    c++11多线程编程库中的future库的使用实例,供多线程编程参考学习

    future2.1.6

    创建一个`ThreadPoolExecutor`实例后,我们可以通过`submit()`方法提交任务,它会返回一个`Future`对象,通过这个对象我们可以查询任务状态、等待结果或者取消任务。 2. **ProcessPoolExecutor**:进程池执行器则是...

    java高级编程100实例

    1. **多线程编程**:Java提供了强大的并发支持,如Thread类和Runnable接口,以及ExecutorService和Future等高级工具。实例可能会涵盖线程同步(如synchronized关键字、wait/notify机制、ReentrantLock)和并发集合...

    通过类名获取类的实例对象

    在C++中,我们可以使用`std::condition_variable`、`std::promise`和`std::future`等工具来构建消息传递系统。这种机制可以让一个线程发送消息(即数据),另一个线程接收到消息后进行处理。在上述的类实例化过程中...

    Java中的Runnable,Callable,Future,FutureTask的比较

    当你有一个Callable任务并希望将其作为线程执行时,可以创建一个FutureTask实例,然后将这个实例传递给Executor。 下面简要说明它们之间的关系和用法: - Runnable通常用于简单的任务,不关心结果的返回。 - ...

    Java并发编程Callable与Future的应用实例代码

    Java并发编程Callable与Future的应用实例代码 在Java并发编程中,Callable与Future是两个非常重要的概念,它们通常结合使用来实现异步编程。在本文中,我们将详细介绍Callable与Future的应用实例代码,并探究它们在...

    简单多线程实例简单多线程实例简单多线程实例

    3. 使用`ExecutorService`和`Future`:Java 5引入了`java.util.concurrent`包,提供了线程池和任务提交的高级功能。这种方式更推荐,因为它可以更好地管理线程资源。 ```java ExecutorService executor = Executors....

    JAVA经典的40个实例

    14. **并发编程**:探索高级并发工具如ExecutorService、Future和Callable,提高多线程应用的效率。 15. **数据结构与算法**:如排序算法(冒泡、选择、插入、快速、归并)、查找算法(顺序、二分)等,提升编程...

    JAVA实例编程100例3

    JAVA的并发库非常丰富,包括`java.lang.Thread`,`java.util.concurrent`包等,这个实例可能是关于线程同步,如使用`synchronized`关键字,wait/notify机制,或者更高级的并发工具如`ExecutorService`和`Future`。...

Global site tag (gtag.js) - Google Analytics