`
生活的聆听者
  • 浏览: 17274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA异步任务执行之-FutureTask

 
阅读更多

FutureTask为可取消的异步计算任务的程序处理。这个异步任务是可以取消的,


。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。

可使用 FutureTask 包装 Callable 或 Runnable 对象。因为 FutureTask 实现了 Runnable,所以可将 FutureTask 提交给 Executor 执行。

除了作为一个独立的类外,此类还提供了 protected 功能,这在创建自定义任务类时可能很有用。


这个JDK官方手册的解释,至于FutureTask提供哪些方法请自行查看API.


下面根据本人的理解勇哥简单的程序来诠释FutureTask的意思,程序的设计思想为:当一辆公交车到站之后司机需要停车等待所有乘客上车之后才能继续开车行驶,这里我们把司机开车认为为主线程,乘客上车为其他线程,只有所有乘客上车完毕司机才能开车。我们可以把乘客上车当做是一个异步计算任务,异步任务一执行完毕,主线程启动并且这个异步任务状态不再改变。


程序如下:



乘客这个异步任务:


package com.test.futuretask;

import java.util.concurrent.Callable;

public class PassengerCallable implements Callable{

    //总共有10个等待上公交的乘客
    private int passengerCounts = 10;
    //所有乘客上公交花费的所有时间
    private int totalTime = 0;
    @Override
    public Integer call() throws Exception {
        while(passengerCounts > 0) {
            passengerCounts--;
            totalTime++;
            //每个乘客上车花费1秒
            Thread.sleep(1 * 1000);
        }
        
        return totalTime;
    }

}

 
司机主线程:


package com.test.futuretask;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class BusDriverMainThread {

    public static void main(String args[]) {
    
        Callable callable = new PassengerCallable();
        
        FutureTask futureTask = new FutureTask(callable);
        
        Thread thread = new Thread(futureTask);
        
        thread.start();
        
        while (!futureTask.isDone()) {
            System.out.println("还有乘客没有上车,司机继续等待....");
        }
        
        int countTime = 0;
        try {
            countTime = futureTask.get();
        } catch (InterruptedException e) {
            // TODO 
            e.printStackTrace();
        } catch (ExecutionException e) {
            // TODO
            e.printStackTrace();
        } finally {
            System.out.println("所有乘客都已全部上车,司机请开车,总共花费" + countTime + "秒");
        }
    }
    
}

 

 

分享到:
评论

相关推荐

    Java 多线程与并发(17-26)-JUC线程池- FutureTask详解.pdf

    `FutureTask`是Java并发编程中一个非常重要的工具,它不仅可以用于封装任务并异步执行,还能方便地获取任务执行结果以及管理任务的状态。理解`FutureTask`的工作原理及其使用方法,对于提高程序的并发性能和响应能力...

    futuretask用法及使用场景介绍

    FutureTask是一种异步获取执行结果或取消执行任务的机制,它可以用来处理耗时的计算任务,使主线程不需要等待计算结果,而是继续执行其他任务。下面将详细介绍FutureTask的用法和使用场景。 一、FutureTask的使用...

    Java中的Runnable,Callable,Future,FutureTask的比较

    - FutureTask结合了Runnable和Future,可以作为Executor框架的一部分,方便地管理和控制异步任务的执行。 在实际开发中,ExecutorService(如ThreadPoolExecutor)经常与Future和FutureTask一起使用,因为...

    java多线程异步性

    在Java中,通常通过Future和Callable接口实现异步计算,或者使用ExecutorService和CompletionService来管理和控制异步任务。 三、ExecutorService与ThreadPoolExecutor ExecutorService是Java并发框架中的核心接口...

    Android异步并发类库Android-lite-go.zip

    LiteGo可以直接投入Runnable、Callable、FutureTask 等类型的实现来运行一个任务,它的核心组件是「SmartExecutor」,它可以用来作为「App」内支持异步并发的唯一组件。 在一个App中「SmartExecutor」可以有多个...

    java android业务异步编程小技巧

    5. **FutureTask**和`ExecutorService`:这是Java并发库的一部分,适用于管理多个异步任务。ExecutorService可以创建线程池,FutureTask则表示异步计算的结果,可以检查任务是否完成,获取或取消结果。 6. **RXJava...

    FutureTask学习

    总之,`FutureTask`是Java并发编程中用于异步计算的一个强大工具,它结合了`Runnable`和`Callable`的优点,提供了任务执行状态的检查以及结果的获取。理解和熟练使用`FutureTask`对于编写高效并发程序至关重要。在...

    spring线程池ThreadPoolExecutor配置以及FutureTask的使用

    结合`FutureTask`,我们可以方便地执行异步任务并获取结果,这对于处理大量并发请求的系统来说非常有用。在实际开发中,根据具体需求灵活配置和使用这些工具,能够提升程序的并发处理能力和响应速度。

    Java线程超时监控

    在Java编程中,多线程是并发执行任务的重要方式,然而在实际应用中,我们可能会遇到某些线程执行时间过长或死锁的情况,这可能导致系统资源的浪费甚至整体性能下降。因此,对线程进行超时监控是必要的,以确保程序的...

    Java中Future、FutureTask原理以及与线程池的搭配使用

    `FutureTask`的实现包括了任务状态的管理、中断处理和异常传播等复杂逻辑,确保了异步任务的正确执行和结果获取。理解`Future`和`FutureTask`的工作原理,以及如何与`ExecutorService`配合使用,是进行高效并发编程...

    java实现线程的异步

    Java 实现线程异步是程序设计中的一个重要概念,它涉及到多任务并行处理和非阻塞执行。在Java中,我们可以通过多种方式来实现线程的异步操作,以提高程序的执行效率和响应速度。 一、Java Thread 类 Java Thread 类...

    入门掌握Java并发编程的基石-视频教程网盘链接提取码下载.txt

    - `ExecutorService`:提供了一种管理异步任务执行的方法,它可以调度线程执行任务,还可以控制任务的执行时间。 - **非阻塞算法**:通过使用CAS(Compare and Swap)等原子操作来实现线程间的协调,从而避免了阻塞...

    Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable

    总结一下,`Runnable`用于无返回值的简单任务,`Callable`用于有返回值的任务,`Future`作为结果的容器,而`FutureTask`则将两者结合,使得`Callable`的任务可以通过`ExecutorService`执行。在实际开发中,根据需求...

    Java异步编程最佳实践_.docx

    Java异步编程是一种提高应用程序性能和响应速度的关键技术,特别是在处理I/O密集型任务时。在Java中,异步编程允许程序在等待某些操作完成(如网络请求、文件读写等)的同时,继续执行其他任务,从而提高了整体的...

    FutureTask底层实现分析,有了FutureTask主线程要想获得工作线程(异步计算线程)的结果变得比较简单

    FutureTask 是 Java 中的一种非常重要的多线程设计模式,用于异步计算线程之间的结果传递。在 JDK 中,FutureTask 类是 Future 模式的实现,它实现了 Runnable 接口,作为单独的线程运行。在其 run() 方法中,通过 ...

    Java多线程之异步Future机制的原理和实现共5页.p

    4. **异常处理**:如果异步任务在执行过程中抛出了异常,那么`get()`方法会将这个异常重新抛出,使得主线程可以捕获并处理。 在Java中,实现异步Future机制通常有以下几种方式: 1. **使用FutureTask**:...

    异步CopyDemo

    在异步任务执行过程中,为了提供用户反馈,我们需要将进度更新到主线程。这可以通过Handler、`runOnUiThread`或使用支持异步任务的库(如AsyncTask的回调方法)来实现。 6. **错误处理与资源释放** 异步操作中,...

    分享一个非常好用的异步缓冲区和侦听模板(Java)

    在Java中,可以使用ExecutorService、CompletableFuture、FutureTask等工具实现异步执行。异步处理通常与回调函数、事件驱动编程或基于Promise/Future的模型相结合,以确保当异步操作完成后能够得到通知。这种技术...

    揭密FutureTask.docx

    《揭密FutureTask:Java异步编程的核心工具》 在Java并发编程中,FutureTask扮演着至关重要的角色,它是实现异步计算的关键组件。本文将深入探讨FutureTask的原理和用法,帮助开发者更好地理解和利用这个强大的工具...

    java_util_concurrent中文版pdf

    CountDownLatch用于一次性释放多个线程,CyclicBarrier则允许一组线程等待所有线程到达屏障点后再继续执行,Semaphore管理线程的访问权限,而FutureTask代表一个异步计算的结果。 5. **原子类**:AtomicInteger、...

Global site tag (gtag.js) - Google Analytics