JUC中的FutureTask

package JUC;

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

/**
 * RunnableAndCallable两个类的比较
 * @author YEXIN
 *
 */
/**
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,
 直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,
 因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
 另外,FutureTask还可以确保即使调用了多次run方法,
  它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等。
1. FutureTask执行多任务计算的使用场景
利用FutureTask和ExecutorService,可以用多线程的方式提交计算任务,主线程继续执行其他任务,
当主线程需要子线程的计算结果时,在异步获取子线程的执行结果。

2. FutureTask在高并发环境下确保任务只执行一次
在很多高并发的环境下,往往我们只需要某些任务只执行一次。这种使用情景FutureTask的特性恰能胜任。
举一个例子,假设有一个带key的连接池,当key存在时,即直接返回key对应的对象;当key不存在时,
则创建连接。对于这样的应用场景,通常采用的方法为使用一个Map对象来存储key和连接池对应的对应关系

 *
 */
public class RunnableAndCallable {
    
    class MyThread2 implements Runnable{

        @Override
        public void run() {
            System.out.println("come in Runnable1");
            
        }
        
    }
    
    class MyThread implements Callable{

        @Override
        public Integer call() throws Exception {//实现call方法
            System.out.println("come in Callable1");
            return 200;//有返回值
        }
        
    }
    
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Runnable myThread2  = () -> {System.out.println("come in Runnable2");};//lamda实现,覆盖了原来中的方法体
        myThread2.run();
        
        Callable myThread  = () -> {System.out.println("come in Callable2");return 100;};//lamda实现,覆盖了原来中的方法体
        try {
            Integer m = (Integer) myThread.call();
            System.out.println(m);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
//==================================================================================================        
        //使用FutureTask,它同时实现了Runnable和Callable接口,new的时候可以传入一个Callable接口的实现
        //
        FutureTask fTask = new FutureTask(() -> {
            System.out.println("come in Callable3");
            return 300;
        });
        
        new Thread(fTask,"AA").start();
        //一般FutureTask多用于耗时计算,主线程在自己的任务完成后,再去获取结果
        //仅在计算完成时才能检索结果,如果计算没完成,则阻塞get方法
        System.out.println(fTask.get());
        
        
    }                                                                                    
}

================================================

come in Runnable2
come in Callable2
100
come in Callable3
300

 

你可能感兴趣的:(Java)