首页 > 编程语言 >Java,Future,Callable和Executor

Java,Future,Callable和Executor

时间:2025-01-01 11:55:25浏览次数:3  
标签:Java int Callable Future 线程 Executor data

系列文章目录

Java中Future,Callable和Executor学习入门使用


文章目录


前言

如果需要多线程执行某个任务,又希望分给线程的任务能够按照自己指定顺序得到返回值。那么使用Future,Callable和Executor是一个简单方便的选择。


一、Future,Callable和Executor是什么?

Callable 是一个泛型接口,位于 java.util.concurrent 包下,它定义了一个带返回值的任务方法。与 Runnable 不同,Runnable 的 run 方法没有返回值,而 Callable 的 call 方法可以返回一个具体的值,并且能够抛出受检异常。
Future 同样位于 java.util.concurrent 包,用于代表一个异步任务的执行结果。通过它可以检查任务是否完成、获取任务的执行结果,还能取消任务的执行。
Executor 框架:是一个用于管理和控制线程池的框架,基于 Executor 接口扩展出了一系列接口和类,像 ExecutorService 接口在 Executor 基础上添加了生命周期管理方法(如 shutdown、isShutdown 等)和提交 Callable 任务的能力;ScheduledExecutorService 则支持任务的定时调度。Executors 类提供了一系列静态工厂方法,能够便捷地创建不同类型的线程池

// 创建固定大小的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);  
// 创建缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();  
// 创建单线程的线程池
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();  

二、使用示例

使用分治法获得数组中最大值

1.编写获取数组最大值方法

代码如下(示例):

package com.example.gobuy.utils;

import java.util.concurrent.Callable;

public class FindMaxNum implements Callable<Integer> {
    private int[] data;
    private int start;
    private int end;
    FindMaxNum(int[] data,int start,int end){
        this.data=data;
        this.start=start;
        this.end=end;
    }
    public Integer call(){
        int max = Integer.MIN_VALUE;
        for (int i = start; i < end; i++) {
            if(data[i] > max) max = data[i];
        }
        return max;
    }
}

写一个类实现Callable接口,Callable接口定义了一个call()方法,可以返回任意的类型。

2.使用Executor和future

代码如下(示例):

package com.example.gobuy.utils;

import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MultithreadMaxFinder {
    public static int max(int[] data) throws InterruptedException, ExecutionException{
        if (data.length == 1){
            return data[0];
        }else if (data.length == 0){
            throw new IllegalArgumentException();
        }

        FindMaxNum t1 = new FindMaxNum(data,0,data.length/2);
        FindMaxNum t2 = new FindMaxNum(data, data.length/2,data.length);

        ExecutorService service = Executors.newFixedThreadPool(2);

        Future<Integer> f1 = service.submit(t1);
        Future<Integer> f2 = service.submit(t2);

        return Math.max(f1.get(),f2.get());
    }
}

创建一个固定大小两个线程的线程池,然后分别执行两个计算数组最大值的线程,Future f1 = service.submit(t1),把Callable对象提交给Executor,它会给每个Callable对象创建一个线程去执行。f1.get()方法会阻塞,也就是即使第二个线程已经结束了,也需要等待第一个f1完成。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了Future,Callable和Executor的使用,而Future提供一个方便快捷,启动多个线程处理同一个问题不同部分的工具,能使我们快速便捷地处理数据,只要将任务合适的分解为独立部分,放入线程中可以大大加快任务执行的速度。

标签:Java,int,Callable,Future,线程,Executor,data
From: https://blog.csdn.net/ZZZ_Tong/article/details/144865041

相关文章

  • Java Agent(二)、Javassist入门
    目录1、前言2、什么是Javassist?2.1、Javassist的特点2.2、应用场景3、快速开始3.1、maven依赖3.2、生成一个class文件3.2.1、具体代码3.2.2、执行结果3.3、修改已有类的方法3.3.1、具体代码3.3.2、执行结果3.3.3、问题踩坑3.4、修改属性值3.4.1、具体代码3......
  • 【Java项目】基于SpringBoot+Vue的宠物救助及领养平台的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/90001525基于SpringBoot+Vue的宠物救助及领养平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven宠物救助及领养平台是一个专注于宠物保护和幸福的在线平台。它致力于......
  • Java 虚拟机(JVM)深度剖析:原理、优化与实践探索
    在当今的软件开发领域,Java语言凭借其“一次编写,到处运行”的特性,占据着举足轻重的地位。而Java虚拟机(JavaVirtualMachine,JVM)作为Java程序运行的核心基础设施,负责加载、执行和管理Java字节码,其性能和稳定性直接影响着Java应用的质量和效率。深入研究JVM,对于优化J......
  • Java 大视界 -- Java 微服务架构在大数据应用中的实践:服务拆分与数据交互(一)
           ......
  • Java反射导致Metaspace OOM分析方式、工具与解决方法
    1.前言MetaspaceOOM是Java应用常见的异常,出现MetaspaceOOM时,大部分情况是因为反射生成的类占用了Metaspace太多空间导致的以下主要包含四个部分的内容:Java反射导致MetaspaceOOM的原因及分析方式与工具Java反射导致MetaspaceOOM的解决方式解决Java反......
  • java数据类型-字符型详解
    目录一、基本定义二、表示方式1.字符字面量:2.字符变量声明与赋值:3.常见操作(1)、获取字符的Unicode值(码点):(2)、通过Unicode码点获取字符:(3)、字符的比较操作:(4)、字符参与运算(与其他数据类型结合):(5)、byteshortchar混合运算时,各自会先转换成int再做运算三、字符串相关......
  • Java子线程无法获取Attributes的解决方法
    在Java多线程编程中,开发者经常会遇到子线程无法获取主线程设置的Attributes的问题。Attributes通常用于存储与当前线程相关的数据,尤其在Web应用中,它们常用于请求上下文的管理。然而,由于Java线程是独立运行的,每个线程有自己的内存空间,一个线程无法直接访问另一个线程的局部变量或属......
  • Javaer开发环境的搭建(个人喜好向)
    前言我们进入到新的工作环境,或者电脑重新安装系统后,总要重新配置开发环境,这时候需要四处搜来搜去的就很麻烦了,所以在此做一个笔记文件编辑器个人习惯使用VisualStudioCode大文件查看(比如看1GB以上的日志文件)可以使用EmEditorJavaJDK下载个人使用更习惯OpenJDK,可以在清......
  • 【Java 温故而知新系列】基础知识-03 基本类型对应之包装类
    1、包装类都有哪些?基本类型都有对应的包装类型,这些包装类提供了一种面向对象的方式来处理基本数据类型,允许它们被用于需要对象的场景,如集合框架、泛型等。对应关系:基本类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLong......
  • 使用exe4j将jar转成exe、java打包exe
    1、maven打包需要配置以下插件,注意skip为false插件配置中设置<skip>true</skip>时,实际上是告诉Maven在构建过程中跳过spring-boot-maven-plugin插件的执行。也就是说,Maven在打包时不会将项目打包成可执行的JAR文件,也不会为JAR文件生成必要的MANIFEST.MF文件,......