学习分享-Callable 和 Runnable 任务

2024-06-14 16:44

本文主要是介绍学习分享-Callable 和 Runnable 任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

顺带回顾学习一下Callable 或 Runnable 任务

Callable 和 Runnable 任务

CallableRunnable 是 Java 中用于定义任务的接口,它们主要用于并发编程,允许任务在独立的线程中运行。

Runnable 任务

Runnable 是一个函数式接口,只包含一个 run() 方法。它不返回任何结果,也不能抛出检查型异常。Runnable 适用于不需要返回结果或不需要抛出检查型异常的简单任务。

@FunctionalInterface
public interface Runnable {void run();
}

示例

public class RunnableExample implements Runnable {@Overridepublic void run() {System.out.println("Runnable task is running");}public static void main(String[] args) {RunnableExample runnableTask = new RunnableExample();Thread thread = new Thread(runnableTask);thread.start();}
}
Callable 任务

Callable 是一个泛型接口,只包含一个 call() 方法。它返回一个结果并且可以抛出检查型异常。Callable 适用于需要返回结果或可能抛出异常的复杂任务。

@FunctionalInterface
public interface Callable<V> {V call() throws Exception;
}

示例

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class CallableExample implements Callable<String> {@Overridepublic String call() throws Exception {Thread.sleep(2000); // 模拟长时间的任务return "Callable task completed";}public static void main(String[] args) {CallableExample callableTask = new CallableExample();ExecutorService executorService = Executors.newSingleThreadExecutor();Future<String> future = executorService.submit(callableTask);try {String result = future.get();System.out.println(result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}executorService.shutdown();}
}

Callable 与 Runnable 的区别

  • 返回结果Runnable 不返回结果,而 Callable 返回结果。
  • 异常处理Runnable 不能抛出检查型异常,而 Callable 可以抛出检查型异常。
  • 接口方法Runnable 接口的方法是 run()Callable 接口的方法是 call()

FutureTask 和 Callable 或 Runnable

FutureTask 提供了一种将 CallableRunnable 任务封装起来的机制。你可以将一个 CallableRunnable 任务传递给 FutureTask,然后提交给线程池执行。

示例

import java.util.concurrent.*;public class FutureTaskExample {public static void main(String[] args) {// 使用 Callable 创建一个任务Callable<String> callableTask = () -> {Thread.sleep(2000);return "Callable task completed";};// 使用 FutureTask 封装 Callable 任务FutureTask<String> futureTask = new FutureTask<>(callableTask);// 创建线程池ExecutorService executorService = Executors.newSingleThreadExecutor();// 提交 FutureTask 给线程池执行executorService.submit(futureTask);System.out.println("Main thread is doing other work...");try {// 获取 FutureTask 执行结果String result = futureTask.get();System.out.println("FutureTask result: " + result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}// 关闭线程池executorService.shutdown();}
}

总结

  • Runnable:适用于不需要返回结果或不抛出检查型异常的简单任务。
  • Callable:适用于需要返回结果或可能抛出检查型异常的复杂任务。
  • FutureTask:可以封装 CallableRunnable 任务,提供任务的异步执行、结果获取和任务取消功能。

通过理解 CallableRunnable 的区别,以及 FutureTask 如何封装这些任务,可以更好地进行并发编程和任务管理。

这篇关于学习分享-Callable 和 Runnable 任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060955

相关文章

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen