FutureTask使用示例

本文通过一个具体的Java示例,展示了如何使用FutureTask来处理并发任务。该示例包括了FutureTask的基本用法,如启动任务、获取任务结果及处理任务中可能出现的异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.wenc.concurrency;

import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Preloader {
	
	private static class ProductInfo{
		private String name = "fish";
		private Vector<String> related = new Vector<String>(1000); 
	}
	
	private static final ProductInfo productInfo = new ProductInfo();
	
	private ProductInfo loadProductInfo() {
		//模拟暂停3秒
		for(int i=0;i<3;i++){
			try {
				Thread.sleep(1000);
				System.out.println(i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		throw new RuntimeException("exception test");//情形1,抛出异常
		//return productInfo;//情形2,返回结果
	}
	
	private final FutureTask<ProductInfo> future = new FutureTask<ProductInfo>(
			new Callable<ProductInfo>(){
				public ProductInfo call() {
					return loadProductInfo();
				}
			});
	
	public void start(){
		System.out.println("future start invoked");
		new Thread(future).start();
	}
	
	/**
	 * future.get将阻塞直到任务进入完成状态,然后返回结果或者抛出异常
	 * @return
	 * @throws InterruptedException
	 * @throws ExecutionException
	 */
	public ProductInfo get() throws InterruptedException, ExecutionException{
		System.out.println("future get invoked");
		return future.get();
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		Preloader loader = new Preloader();
		loader.start();
		System.out.println(loader.get().related.capacity());
	}
}


情形1抛出异常:

future start invoked
future get invoked
0
1
2
Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: exception test
	at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
	at java.util.concurrent.FutureTask.get(FutureTask.java:83)
	at com.wenc.concurrency.Preloader.get(Preloader.java:51)
	at com.wenc.concurrency.Preloader.main(Preloader.java:57)
Caused by: java.lang.RuntimeException: exception test
	at com.wenc.concurrency.Preloader.loadProductInfo(Preloader.java:27)
	at com.wenc.concurrency.Preloader.access$0(Preloader.java:17)
	at com.wenc.concurrency.Preloader$1.call(Preloader.java:34)
	at com.wenc.concurrency.Preloader$1.call(Preloader.java:1)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.lang.Thread.run(Thread.java:662)



情形2返回结果:

future start invoked
future get invoked
0
1
2
1000



欢迎回复讨论


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值