java线程池--FutureTask

FutureTask 常用来封装 Callable 和 Runnable,也可以作为一个任务提交到线程池中执行。除了作为一个独立的类之外,此类也提供了一些功能性函数供我们创建自定义 task 类使用。FutureTask 的线程安全由CAS来保证。

一、继承关系

public class FutureTask<V> implements RunnableFuture<V>

public interface RunnableFuture<V> extends Runnable, Future<V>

FutureTask实现了runnable和future接口,有以下几个方法:

run()   cancel()  isCancelled()  isDone()  get()  延迟get()

由于get()方法是获取线程执行结果的,所以FutureTask对象需要一个Callable的对象,或者runnable+返回值

二、线程的状态转移

一个FutureTask只管理一个线程

对应的线程会在FutureTask层反应为以下的状态转移:

image.png

三、核心方法

1、run()

运行任务并set结果给result属性

2、get()

获取线程执行结果,调用这个方法的线程会阻塞等待这个结果

3、awaitDone()

用于等待任务完成,或任务因为中断或超时而终止

4、cancel()

尝试取消任务。如果任务已经完成或已经被取消,此操作会失败。

四、使用示例

static class Task  implements Callable<Integer> {
 
        @Override
        public Integer call() throws Exception {
            System.out.println("Thread [" + Thread.currentThread().getName() + "] is running");
            int result = 0;
            for(int i = 0; i < 100;++i) {
                result += i;
            }
 
            Thread.sleep(3000);
            return result;
        }
}

1、Future + ExecutorService

Task task = new Task();
ExecutorService service = Executors.newCachedThreadPool();
Future<Integer> future = service.submit(task1);
service.shutdown();

 2、FutureTask + ExecutorService

ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
executor.submit(futureTask);
executor.shutdown();

3、FutureTask + Thread

Task task = new Task();
FutureTask<Integer> futureTask = new FutureTask<Integer>(task);
Thread thread = new Thread(futureTask);
thread.start();
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FutureTask是一个具体的实现类,它可以在线程池中使用。当我们使用线程池的submit方法提交一个任务时,返回的是一个Future的实现,而这个实现就是FutureTask的一个具体实例。FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口,所以FutureTask既是Runnable,也是Future。这意味着我们可以将FutureTask作为一个任务提交给线程池,并且可以通过Future接口的方法来获取任务的执行结果或者取消任务的执行。FutureTask是可取消的异步任务,可以通过调用cancel方法来取消任务的执行。当任务执行完成后,我们可以通过调用get方法来获取任务的执行结果。需要注意的是,如果任务还没有完成,调用get方法将会阻塞调用线程,直到任务完成。另外,一旦任务执行完成,就不能重新开始或取消任务,但可以通过调用runAndReset方法来重置任务的状态并重新执行。所以,FutureTask可以在线程池中用来执行异步任务,并且可以方便地获取任务的执行结果或者取消任务的执行。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [【第十二篇】Java 线程池FutureFutureTask【重点】](https://blog.csdn.net/weixin_42039228/article/details/123198358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [深入理解并发编程之线程池FutureTask](https://blog.csdn.net/qq_19586549/article/details/122980971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值