专栏首页歪歪梯ClubFuture与Executor模型

Future与Executor模型

future

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

    public interface Future<V> {
        V get() throws Exception;
    }

callable

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

    public interface Callable<V> {
        V call() throws Exception;
    }

executor

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

    public interface Executor<V> {
        Future<V> execute(Callable<V> callable);
    }

SynchronizedExecutor

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

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执行结果时再抛出

本文分享自微信公众号 - 歪歪梯Club(bcbkmgzh),作者:歪歪梯

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python网络爬虫并输出excel

    环境是python3.6.5以及PyCharm不得不说,JetBrains做的IDE都很不错,无论是这款PyCharm还是IntelliJ、Goland在形参处...

    歪歪梯
  • ActiveMQBytesMessage内容修改

    ActiveMQBytesMessage是activeMQ进行字节传输使用的消息类型,内部维护一个DataInputStream和一个ByteArrayInpu...

    歪歪梯
  • RMI源码分析

    sun.rmi.server.UnicastServerRef sun.rmi.server.UnicastRef sun.rmi.server.Util su...

    歪歪梯
  • 1.2D小游戏开发实记-群英争霸

    4.清空Trigger 在idle状态中AddBehavior,进入idle状态重置atk的trigger

    祝你万事顺利
  • Java开发GUI之Menu菜单 原

        在MacOS上的软件都有一个菜单栏,会浮现在屏幕顶部,Java的awt包中也提供了构建菜单功能的相关组件,示例代码如下:

    珲少
  • AutoFac在项目中的应用

    技能大全:http://www.cnblogs.com/dunitian/p/4822808.html#skill 完整Demo:https://github....

    逸鹏
  • 多线程设计模式解读1—Guarded Suspension(保护性暂挂模式)

    大家好,今天我们给大家介绍一个多线程设计模式的一个概念,我们平时业务代码写得比较多,因此,如果刚上手写比较复杂多线程代码,很有可能会埋下一些坑,而这些坑一时之间...

    java达人
  • Java中如何提升锁性能

    比如100个人去银行办理业务,要填一百张表,但是只有一支笔,那么很显然,每个人用笔的时间越短,效率也就越高。看代码:

    黄泽杰
  • Spring Boot Async异步执行任务

    异步调用就是不用等待结果的返回就执行后面的逻辑,同步调用则需要等带结果再执行后面的逻辑。

    猿天地
  • java设计模式(9)-桥接模式

    这篇推文分享一下桥接模式,JDBC原理也是运用了桥接模式,先设置驱动名称,链接,来获得数据库链接,降低耦合,减少维护

    爱敲代码的猫

扫码关注云+社区

领取腾讯云代金券