Java中的FutureTask实现代码实例

 更新时间:2023年12月31日 09:06:01   作者:_Romeo  
这篇文章主要介绍了Java中的FutureTask手写代码实例,FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果,需要的朋友可以参考下

FutureTask实现

FutureTask是Future的实现,用来异步任务的获取结果,可以启动和取消异步任务,查询异步任务是否计算结束以及获取最终的异步任务的结果。

通过get()方法来获取异步任务的结果,但是会阻塞当前线程直至异步任务执行结束。

一旦任务执行结束,任务不能重新启动或取消,除非调用runAndReset()方法

代码示例:

public class ThreadTest_Demo {
    static ExecutorService executors = Executors.newScheduledThreadPool(2);
    public ThreadTest_Demo() {
    }
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<String> callable = new Callable<String>() {
            public String call() throws Exception {
                String str = "返回某个数据!";
                return str;
            }
        };
        Future<String> submit = executors.submit(callable);
        KaneFutureTask<String> futureTask = new KaneFutureTask(callable);
        (new Thread(futureTask)).start();
        System.out.println((String)futureTask.get());
    }
}

实现一个自己的FutureTask

根据FutureTask核心原理,要实现一个FutureTask必须满足以下方面:

  • 需要泛型定义用以返回结果类型
  • 需要一个callable对象,在构造方法中传入
  • 需要实现runnable接口,在run方法中实现具体结果计算
  • 需要一个公开的get方法来获取结果
  • 如果线程没有执行完,则调用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;
    }
	//run()方法未执行未必,阻塞
    public T get() {
        if ("END".equals(this.state)) {
            return this.result;
        } else {
            while(!"END".equals(this.state)) {//这里开始阻塞
            	//把线程存放到容器中
                this.waiters.offer(Thread.currentThread());
                //阻塞
                LockSupport.park();
            }
            return this.result;
        }
    }
    public void run() {
        try {
        	//执行Callable的call方法
            this.result = this.callable.call();
        } catch (Exception var5) {
            var5.printStackTrace();
        } finally {
        	//线程状态修改
            this.state = "END";
        }
		//从容器中取出当前线程
		Thread waiter = (Thread)this.waiters.poll();
        for(waiter != null) {
        	//取消阻塞
            LockSupport.unpark(waiter);
            waiter = (Thread)this.waiters.poll()
        }
    }
}

到此这篇关于Java中的FutureTask手写代码实例的文章就介绍到这了,更多相关FutureTask代码实例内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8 LocalDateTime极简时间日期操作小结

    Java8 LocalDateTime极简时间日期操作小结

    这篇文章主要介绍了Java8-LocalDateTime极简时间日期操作整理,通过实例代码给大家介绍了java8 LocalDateTime 格式化问题,需要的朋友可以参考下
    2020-04-04
  • mybatis-plus 处理大数据插入太慢的解决

    mybatis-plus 处理大数据插入太慢的解决

    这篇文章主要介绍了mybatis-plus 处理大数据插入太慢的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 服务器CPU高居不下,JAVA线程占用排查方式

    服务器CPU高居不下,JAVA线程占用排查方式

    这篇文章主要介绍了服务器CPU高居不下,JAVA线程占用排查方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringMVC拦截器——实现登录验证拦截器的示例代码

    SpringMVC拦截器——实现登录验证拦截器的示例代码

    本篇文章主要介绍了SpringMVC拦截器——实现登录验证拦截器的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • 基于Spring Boot的线程池监控问题及解决方案

    基于Spring Boot的线程池监控问题及解决方案

    这篇文章主要介绍了基于Spring Boot的线程池监控方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • SpringMVC异步处理的 5 种方式示例详解

    SpringMVC异步处理的 5 种方式示例详解

    这篇文章主要介绍了SpringMVC异步处理的 5 种方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Junit测试多线程无法得到结果的问题解决

    Junit测试多线程无法得到结果的问题解决

    在测试一个文件转换工具类的时候,发生一个有趣的现象,同样的输入,使用Main函数可以正确解析,得到结果,使用Junit却无法得到结果,神奇的是,即使捕获Throwable,也无法捕获到仍和异常。
    2021-05-05
  • spring aop两种配置方式

    spring aop两种配置方式

    这篇文章主要为大家详细介绍了spring aop两种配置方式,主要是注解配置AOP和xml配置aop,需要的朋友可以参考下
    2015-09-09
  • Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream

    这篇文章主要给大家介绍了关于Java中zip文件压缩与解压之ZipInputStream和ZipOutputStream的相关资料,ZipInputStream 和 ZipOutputStream 可以用于处理 ZIP文件格式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • mybatis新增save结束后自动返回主键id详解

    mybatis新增save结束后自动返回主键id详解

    这篇文章主要介绍了mybatis新增save结束后自动返回主键id详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论