当前位置: 首页 > news >正文

多线程-Runable和Callable的区别

在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.lryc.cn/news/114019.html

相关文章:

  • 智慧城市规划新引擎:探秘数字孪生中的二维与三维GIS技术差异
  • Python入门自学进阶-Web框架——38、redis、rabbitmq、git
  • 论 SoC上的Linux如何拉动外部I/O
  • SpringBoot项目如何部署SSL证书 (JKS格式)
  • 成功解决:ValueError Cannot assign non-leaf Tensor to parameter ‘weight‘
  • 面试之快速学习SQL-基础增删改查语句
  • nuxt脚手架创建项目
  • 复现原型链污染漏洞
  • .Net6 Web Core API 配置 Autofac 封装 --- 依赖注入
  • 鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统 em
  • 【搭建PyTorch神经网络进行气温预测】
  • .Net6 Web Core API --- AOP -- log4net 封装 -- MySQL -- txt
  • 【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)
  • 微信小程序多图片上传实用代码记录
  • android实现获取系统全局对象实例
  • viewerjs 如何新增下载图片功能(npm包补丁)
  • 基于YOLOv7开发构建MSTAR雷达影像目标检测系统
  • 关于c++中mutable、const、volatile这三个关键字及对应c++与汇编示例源码
  • 把大模型装进手机,分几步?
  • c++游戏制作指南(三):c++剧情类文字游戏的制作
  • Flutter系列文章-实战项目
  • HCIA---TCP/UDP协议
  • 数据库索引的使用
  • 校验 GPT-4 真实性的三个经典问题:快速区分 GPT-3.5 与 GPT-4,并提供免费测试网站
  • SpringBoot整合MongoDB连接池(含源码)
  • [oeasy]python0082_[趣味拓展]控制序列_清屏_控制输出位置_2J
  • Zookeeper+kafka
  • Gpt微信小程序搭建的前后端流程 - 前端小程序部分-1.基础页面框架的静态设计(二)
  • Flask进阶:构建RESTful API和数据库交互
  • 6.9(Java)二叉搜索树