4.3.6 FutureTask核心思想

FutureTask

where-经典场景

查询多个系统数据后进行 汇总返回:
在这里插入图片描述

public class ThreadTest_Demo {

    static  ExecutorService executors = Executors.newScheduledThreadPool(2);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Callable<String> callable = new Callable<String>() {
            @Override
            public String call() throws Exception {
                //
                String str = "返回某个数据!";
                return str;
            }
        };
        Future<String> submit = executors.submit(callable);
//        System.out.println(submit.get());

        KaneFutureTask<String> futureTask = new KaneFutureTask<>(callable);
        new Thread(futureTask).start();
        System.out.println(futureTask.get());


    }
}


public class KaneFutureTask<T> implements Runnable {

    private Callable<T>  callable;

    T result;

    volatile  String state = "NEW";

    LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue<>();

    public KaneFutureTask(Callable<T> callable) {
        this.callable = callable;
    }

    public T get(){ //阻塞,等待run方法执行完毕.
        if("END".equals(state)) {
            return result;
        }

        while (!"END".equals(state)){ //开始执行阻塞.
            //准备一个容器,通过这个容器来去存放线程。
            waiters.offer(Thread.currentThread());
            LockSupport.park();
        }

        return result;
    }

    @Override
    public void run() {
        try {
            result = callable.call();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            state = "END";
        }
        Thread waiter = waiters.poll();
        while (waiter!=null){
            LockSupport.unpark(waiter);
            waiter =waiters.poll();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值