FutureTask多线程执行

Java并发编程之FutureTask使用详解

一、FutureTask概念

FutureTask是一个实现了Future接口的类,它可以用来表示一个异步任务的结果。当异步任务完成时,FutureTask会通知等待的任务继续执行。FutureTask的主要作用是将任务的执行与返回值解耦,使得任务可以单独执行,而不需要等待返回值。

二、FutureTask使用场景

  1. 异步执行任务:当我们需要在多线程环境下执行一个任务,而不希望等待任务完成时,可以使用FutureTask。
  2. 提取异步任务返回值:当异步任务完成后,可以通过FutureTask获取任务的结果。
  3. 取消异步任务:FutureTask提供了取消异步任务的方法,当不需要执行某个异步任务时,可以使用此方法取消任务。
  4. 处理并行任务:当需要执行多个异步任务,并且这些任务之间相互独立时,可以使用FutureTask进行处理。

三、FutureTask代码示例

以下代码示例将展示如何使用FutureTask实现异步编程:

package service.study;

import com.alibaba.fastjson.JSONObject;

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

public class ConcurrentService {

    public static void main(String[] args) throws Exception {
        ConcurrentService service = new ConcurrentService();
        service.futureTask();
    }


    public void futureTask() throws ExecutionException, InterruptedException {

        long start = System.currentTimeMillis();
        Callable userCallable = new Callable() {
            @Override
            public JSONObject call() throws Exception {
                return getUserInfo();
            }
        };

        Callable bankCallable = new Callable() {
            @Override
            public JSONObject call() throws Exception {
                return getBankInfo();
            }
        };

        FutureTask<JSONObject> userInfoTask = new FutureTask<>(userCallable);
        FutureTask<JSONObject> bankInfoTask = new FutureTask<>(bankCallable);

        new Thread(userInfoTask).start();
        new Thread(bankInfoTask).start();

        JSONObject result = new JSONObject();
        result.putAll(userInfoTask.get());
        result.putAll(bankInfoTask.get());
        long end = System.currentTimeMillis();

        System.out.println(Thread.currentThread().getName() + " 总耗时:" + (end - start) + " ms");
    }


    private JSONObject getUserInfo() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(3000L);
        JSONObject json = new JSONObject();
        json.put("name", "Lucy");
        json.put("age", 18);
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + " getUserInfo 耗时:" + (end - start) + " ms");
        return json;
    }


    private JSONObject getBankInfo() throws InterruptedException {
        long start = System.currentTimeMillis();
        Thread.sleep(2000L);
        JSONObject json = new JSONObject();
        json.put("no", "ICBC222200008888");
        json.put("money", "200W");
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + " getBankInfo 耗时:" + (end - start) + " ms");
        return json;
    }

}

四、执行结果

在这里插入图片描述

总结

通过以上示例,我们可以看到FutureTask在异步编程中的应用。在实际项目中,可以根据需求使用FutureTask来提高代码的可读性和可维护性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值