使用CallableFuture以及FutureTask进行线程操作

Posted silenceshining

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用CallableFuture以及FutureTask进行线程操作相关的知识,希望对你有一定的参考价值。

Future接口代表异步计算的结果,并且提供方法来检测异步过程的进展。Callable接口与Runnable接口比较类似,提供线程的执行体,即run方法的内容。

Future与Callable结合使用开启一个新线程执行,最大的特点是能提供返回值,这样也就能实现类似同步执行的情况,看以下示例,在新线程中模拟5s的耗时操作,使用future.get将阻塞等待返回结果。

package demo.thread;

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

public class CallableDemo 
    public static void main(String[] args) throws InterruptedException,
            ExecutionException 
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future = executorService.submit(new Callable<String>() 
            @Override
            public String call() throws Exception 
                Thread.sleep(5000);
                return "future result";
            
        );
        System.out.println(System.currentTimeMillis());
        System.out.println(future.get());
        System.out.println(System.currentTimeMillis());
    

执行结果如下:

1562077654406
future result
1562077659407

FutureTask间接实现了Runnable和Future接口,同样可以实现上述功能,如下:

package demo.thread;

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

public class FutureTaskDemo 

    public static void main(String[] args) throws InterruptedException,
            ExecutionException 
        FutureTask<String> futureTask = new FutureTask<String>(
                new Callable<String>() 

                    @Override
                    public String call() throws Exception 
                        Thread.sleep(5000);
                        return "future result";
                    
                );
        new Thread(futureTask).start();
        System.out.println(System.currentTimeMillis());
        System.out.println(futureTask.get());
        System.out.println(System.currentTimeMillis());

    

执行结果如下:

1562077797983
future result
1562077802985

 

 

以上是关于使用CallableFuture以及FutureTask进行线程操作的主要内容,如果未能解决你的问题,请参考以下文章

CallableFuture和FutureTask使用说明

CallableFuture和FutureTask

CallableFuture和FutureTask

线程之CallableFuture 和FutureTask使用及源码分析

java并发编程:CallableFuture和FutureTask

Java并发编程:CallableFuture和FutureTask