Future callback实现

FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask还可以确保即使调用了多次run方法,它都只会执行一次Runnable或者Callable任务,或者通过cancel取消FutureTask的执行等

public class CallBackTest {

    static ExecutorService threadPool = Executors.newFixedThreadPool(1000);
    public static int count = 0;

    public static void main(String[] str) {
        FutureTask task = new FutureTask(new CallBackTest().new Task());
        for (int i = 1; i <= 1000; i++) {
            threadPool.submit(task);
        }
        threadPool.shutdown();
        try {
            if (!threadPool.awaitTermination(10000, TimeUnit.MILLISECONDS)) {
                // 超时的时候向线程池中所有的线程发出中断(interrupted)。
                threadPool.shutdownNow();
            }
        } catch (InterruptedException e) {
            threadPool.shutdownNow();
        }
        System.out.println(Thread.currentThread().getName() + ":" + count);

        addCallback(task, new FutureCallback() {

            @Override
            public void onSuccess(Object result) {
                System.out.println("future callback result:" + result);
            }

            @Override
            public void onFailure(Throwable t) {
                System.out.println(t);
            }

        });
    }

    private static <V> void addCallback(Future future, FutureCallback callback) {
        V value = null;
        if (future.isDone()) {
            try {
                value = (V)future.get();
            } catch (InterruptedException e) {
                callback.onFailure(e.getCause());
            } catch (ExecutionException e) {
                callback.onFailure(e.getCause());
            }
            callback.onSuccess(value);
        }
    }

    public interface FutureCallback<V> {
        void onSuccess(V result);

        void onFailure(Throwable t);
    }

    public class Task implements Callable<Integer> {

        @Override
        public Integer call() {
            synchronized (this) {
                count++;
                System.out.println(Thread.currentThread().getName() + ":" + count);
                try {
                    Thread.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return count;
        }

    }

 

run result:

pool-1-thread-1:1
main:1
future callback result:1

参考:http://www.cnblogs.com/Booker808-java/p/9502377.html

google guava Futures.addCallBack()方法实现

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值