学习分享-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

相关文章

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir