多线程-Runable和Callable的区别

news/2025/2/12 1:23:10/

在Java中,多线程可以通过实现Runnable接口或使用Callable接口来实现。这两种方式有一些区别,如下所示:

返回值:

  • Runnable接口的run()方法没有返回值,它表示一个没有返回结果的任务。
  • Callable接口的call()方法有返回值,可以返回计算结果。

异常处理:

  • Runnable接口的run()方法不能抛出受检查异常,只能通过捕获异常并在方法内部处理。
  • Callable接口的call()方法可以抛出受检查异常,调用者需要捕获并处理异常。

使用方式

  • Runnable接口通常用于执行没有返回结果的任务,可以通过Thread类的构造函数来创建线程并传递一个Runnable对象。
  • Callable接口通常用于执行有返回结果的任务,需要配合ExecutorService接口或Future接口来提交和执行任务。

返回结果获取

  • Runnable接口没有提供直接获取任务执行结果的方法。
  • Callable接口的call()方法返回一个Future对象,通过该对象可以获取任务的执行结果。

代码案例

Runnable
public class MyRunnable implements Runnable {@Overridepublic void run() {// 在这里编写任务逻辑System.out.println("Hello from MyRunnable!");}
}public class Main {public static void main(String[] args) {// 创建一个Runnable对象Runnable myRunnable = new MyRunnable();// 创建一个线程并将Runnable对象传递给它Thread thread = new Thread(myRunnable);// 启动线程thread.start();}
}
Callable
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {// 在这里编写任务逻辑return "Hello from MyCallable!";}
}public class Main {public static void main(String[] args) throws Exception {// 创建一个Callable对象Callable<String> myCallable = new MyCallable();// 创建一个线程池ExecutorService executor = Executors.newSingleThreadExecutor();// 提交Callable任务并获取Future对象Future<String> future = executor.submit(myCallable);// 获取任务的执行结果String result = future.get();// 输出结果System.out.println(result);// 关闭线程池executor.shutdown();}
}

综上所述

Runnable接口适用于不需要返回结果的简单任务,而Callable接口适用于需要返回结果并可能抛出异常的任务。如果需要并发执行多个任务并获取它们的结果,可以使用Callable接口结合ExecutorService或Future来实现。


http://www.ppmy.cn/news/1015072.html

相关文章

云原生基础架构的最佳状态,就是没有架构?

云原生基础架构是通向云原生时代的基石&#xff0c;对于很多架构师来说&#xff0c;上云之后&#xff0c;架构为什么成为了云原生架构而不是传统的架构&#xff0c;两者有何区别&#xff1f;云原生基础架构是如何演进的&#xff1f;本文进行了全面梳理。 什么不是云原生基础架…

GitHub霸榜的顶级分布式笔记,阿里内部独家分享

微服务因其高内聚、低耦合、高扩展、敏捷开发为很多企业所用&#xff0c;当然&#xff0c;没有任何一项技术是完美的。系统微服务化后&#xff0c;一个看似简单的功能&#xff0c;内部可能需要调用多个服务器并操作多个数据库实现。 毫不夸张地说&#xff0c;分布式事务已经成…

分布式和高并发的详细介绍

分布式系统和高并发性能是现代计算领域中的两个关键概念。随着互联网和计算技术的迅速发展&#xff0c;越来越多的应用需要能够处理大规模的数据和用户并发。在本文中&#xff0c;我们将深入介绍分布式系统和高并发性能的概念、特点、挑战和应对方法。 分布式系统的介绍 分布…

CentOS7删除用户完全指南

一、概览 在Linux中&#xff0c;用户账户是最重要的组成部分之一。在CentOS7中&#xff0c;管理员可以通过多种方式来管理用户账户。包括创建、修改和删除用户账户等。删除用户账户时&#xff0c;需要注意一些细节和陷阱&#xff0c;以确保操作的安全性和正确性。 二、删除用…

前端笔试---acm模式---最近小结

前言 之前一直刷力扣&#xff0c;昨天做了小红书笔试&#xff0c;发现是acm模式&#xff0c;不太熟悉&#xff0c;特此总结。其实如果是acm模式就需要自己写一下输入输出。前端一般有两个选择&#xff0c;一个是基于 V8 环境&#xff0c;另一个是基于 node。 如果大家有什么踩…

【SA8295P 源码分析】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总

【SA8295P 源码分析】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总 一、QNX侧1.1 surfacedump 功能1.2 screenshot 功能二、Android GVM 侧2.1 screencap -p 导出 PNG 图片2.2 screencap 不加 -p 参数,导出 RGB32 图片2.3 dumpsys SurfaceFlinger --display-id 方法系列文…

【网络安全】等保测评系列预热

【网络安全】等保测评系列预热 前言1. 什么是等级保护&#xff1f;2. 为什么要做等保&#xff1f;3. 路人甲疑问&#xff1f; 一、等保测试1. 渗透测试流程1.1 明确目标1.2 信息搜集1.3 漏洞探索1.4 漏洞验证1.5 信息分析1.6 获取所需1.7 信息整理1.8 形成报告 2. 等保概述2.1 …

Java课题笔记~ AspectJ 对 AOP 的实现(掌握)

AspectJ 对 AOP 的实现(掌握) 对于 AOP 这种编程思想&#xff0c;很多框架都进行了实现。Spring 就是其中之一&#xff0c;可以完成面向切面编程。然而&#xff0c;AspectJ 也实现了 AOP 的功能&#xff0c;且其实现方式更为简捷&#xff0c;使用更为方便&#xff0c;而且还支…