异步获取线程计算的结果-Future

2020-01-02   阅读(105)  

Future 接口是 JDK1.5 开始提供。它的作用是异步获取线程计算的结果。

 

看一个等待、获取任务执行结果的例子:

package constxiong.interview;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 测试 Future
 * @author ConstXiong
 * @date 2020-01-02 16:49:03
 */
public class TestFuture {

    private static ExecutorService executor = Executors.newSingleThreadExecutor();
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //去除 Helle 2020 空格,判断任务执行状态,输出等待信息
        Future<String> future = removeBlank("Helle 2020");
        while (!future.isDone()) {
            Thread.sleep(1000L);
            System.out.println("等待1秒");
        }
        System.out.println(future.get());
        executor.shutdown();
    }
    
    /**
     * 移除字符串中的空白符号
     * @param str
     * @return 
     */
    private static Future<String> removeBlank(String str) {
        return executor.submit(() -> {
            Thread.sleep(3000L);
            return str.replace(" ", "");
        });
    }
    
}

 

可以看出 Future 接口里的 isDone() 方法可以判断任务是否已经执行完成,get() 方法可以获取到任务的执行结果

Future 接口包含 5 个方法如下:

boolean cancel(boolean mayInterruptIfRunning);//取消任务
boolean isCancelled();//判断任务是否已取消  
boolean isDone();//判断任务是否已结束
get();//获得任务执行结果
get(long timeout, TimeUnit unit);//获得任务执行结果,支持超时

 

Future 对象是由 ExecutorService 接口的 3 个提交任务的方法返回

Future<?> submit(Runnable task);//提交 Runnable 任务
<T> Future<T> submit(Callable<T> task);//提交 Callable 任务
<T> Future<T> submit(Runnable task, T result);//提交 Runnable 任务及结果引用,result 用于主线程和任务执行线程间通信


第 3 个接口通过 T result 可以在主线程和任务执行线程间进行通信

例子如下:

package constxiong.interview;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 测试 Future
 * @author ConstXiong
 * @date 2020-01-02 16:49:03
 */
public class TestFuture {

	private static ExecutorService executor = Executors.newSingleThreadExecutor();
	
	public static void main(String[] args) throws Exception {
		testGetReplaceBlankWithResult();
	}
	
	private static void testGetReplaceBlankWithResult() throws Exception {
		//用 Result 对象里的 str 字符串替换 Helle 2020 中的空格
		Result r = new Result(" ConstXiong ");
		Future<String> future = replaceBlank("Helle 2020", r);
		System.out.println(future.get());
		System.out.println(r.getStr());
		executor.shutdown();
	}
	
	/**
	 * 根据 Result 对象的 str 属性替换目标字符串中的空格,并且修改 Result 对象的 str
	 * @param str
	 * @return 
	 */
	private static Future<String> replaceBlank(String str, Result result) {
		return executor.submit(() -> {
			Thread.sleep(3000L);
			String newStr = str.replace(" ", result.getStr());
			result.setStr("大俊子");
			return newStr;
		});
	}
	
}

class Result {
	
	private String str;
	
	public Result(String str) {
		this.str = str;
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
	
}

 

ConstXiong 备案号:苏ICP备16009629号-3