前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Future与Executor模型

Future与Executor模型

作者头像
歪歪梯
发布2020-06-19 16:18:40
4190
发布2020-06-19 16:18:40
举报
文章被收录于专栏:歪歪梯Club

future

future代表一个任务的预执行结果,通过get方法获取执行结果

代码语言:javascript
复制
    public interface Future<V> {
        V get() throws Exception;
    }

callable

callable代表一个要执行的任务,执行方法call,执行完成返回一个值

代码语言:javascript
复制
    public interface Callable<V> {
        V call() throws Exception;
    }

executor

executor为执行器,通过执行器来执行任务并得到预执行结果对象future

代码语言:javascript
复制
    public interface Executor<V> {
        Future<V> execute(Callable<V> callable);
    }

SynchronizedExecutor

使用synchronized关键字实现的执行器

代码语言:javascript
复制
public class SynchronizedExecutor<V> implements Executor<V> {

    static class ExecutorThread<V> extends Thread{
        public Object lock;
        public V result;
        public Callable<V> task;
        public Exception e;
        public boolean isDone = false;
        public ExecutorThread(Callable<V> task,Object lock) {
            this.lock = lock;
            this.task = task;
        }
        @Override
        public void run() {
            try {
                result = task.call();
            } catch (Exception e) {
                this.e = e;
            }finally {
                synchronized (lock) {
                    //需持有锁才能调用notify
                    this.isDone = true;
                    lock.notifyAll();
                    //此处的加锁只是为了获得锁
                }
            }

        }

    }

    @Override
    public Future<V> execute(Callable<V> callable) {
        Object lock = new Object();
        ExecutorThread<V> thread = new ExecutorThread<V>(callable,lock);
        thread.start();
        Future<V> future = new Future<V>() {

            @Override
            public V get() throws Exception {
                synchronized (lock) {
                    //通过锁机制,使得未完成时,get方法陷入等待队列,让出cpu给别的线程,异步完成时再唤醒
                    //需持有锁才能调用wait
                    while(!thread.isDone) {
                        lock.wait();
                    }
                    if(thread.e != null) {
                        throw thread.e;
                    }
                    return thread.result;
                }
            }

        };

        return future;
    }

}

总结

优点:通过多线程执行并立即返回一个Future对象,而不等待任务,使得源线程继续执行, 只有当源线程需要多线程执行结果,调用其get方法时,通过创建执行线程时创建的对象锁来阻塞线程直到任务执行完成 当执行过程中如果有抛出异常,则先捕获该异常,在调用get执行结果时再抛出

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 歪歪梯Club 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • future
  • callable
  • executor
  • SynchronizedExecutor
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档