Java多线程:Runnable与Callable的区别和原理
Java多线程:Runnable与Callable的区别和原理
在Java多线程编程中,我们经常使用Runnable和Callable接口来创建并执行线程。这两个接口都是Java.lang包中的部分,并且都用于实现多线程。虽然它们有些相似之处,但它们之间也存在明显的差异。在本文中,我们将深入探讨这两种接口的差异以及它们的工作原理。
一、定义
- Runnable接口: 它只有一个方法,run()。这个接口定义了一个线程的行为,即当线程启动时,它会执行run()方法中的代码。
public interface Runnable {void run();
}
- Callable接口: 与Runnable不同,Callable接口不仅有一个run()方法,还有一个call()方法。call()方法返回一个结果,并可以抛出一个受检查的异常。
public interface Callable<V> {V call() throws Exception;
}
二、使用
- Runnable: 我们通常将Runnable接口的实现类传递给Thread的构造函数来创建并启动新线程。
Runnable runnable = () -> {System.out.println("Running in Runnable");
};Thread thread = new Thread(runnable);
thread.start();
- Callable: 我们通常将Callable接口的实现类传递给ExecutorService的submit()方法来创建并启动新线程。与Runnable不同,Callable可以返回结果,如果我们需要处理结果,可以调用Future的get()方法来获取。
Callable<String> callable = () -> {Thread.sleep(1000);return "Hello from Callable";
};ExecutorService executorService = Executors.newFixedThreadPool(1);
Future<String> future = executorService.submit(callable);try {System.out.println("Result from Callable: " + future.get());
} catch (InterruptedException | ExecutionException e) {e.printStackTrace();
} finally {executorService.shutdown();
}
三、原理
- Runnable: Runnable接口的主要目的是为了实现多线程的执行代码。当我们启动一个线程时,JVM会将run()方法的代码分配给线程的CPU来执行。这个过程是同步的,一旦run()方法执行完毕,线程就会结束。因此,Runnable适用于不需要返回结果的场景。
- Callable: Callable接口不仅可以执行代码,还可以返回结果。call()方法的执行是异步的。当call()方法返回结果时,线程不会立即结束,而是等待其他线程调用get()方法来获取结果。因此,Callable适用于需要返回结果的场景。
总的来说,Runnable和Callable都是用于实现多线程的工具,但它们的设计目的和使用场景是不同的。Runnable更适合用于执行简单的、不需要返回结果的任务,而Callable更适合用于需要返回计算结果的任务。在编写多线程程序时,我们需要根据实际需求选择适当的接口。
相关文章:
Java多线程:Runnable与Callable的区别和原理
Java多线程:Runnable与Callable的区别和原理 在Java多线程编程中,我们经常使用Runnable和Callable接口来创建并执行线程。这两个接口都是Java.lang包中的部分,并且都用于实现多线程。虽然它们有些相似之处,但它们之间也存在明显的…...
解决yolo无法指定显卡的问题,实测v5、v7、v8有效
方法1 基本上这个就能解决了!!! 在train.py的最上方加上下面这两行,注意是最上面,其次指定的就是你要使用的显卡 import os os.environ[CUDA_VISIBLE_DEVICES]6方法2: **问题:**命令行参数指…...
arc 166 a
#include<bits/stdc.h> using namespace std; using VI vector<int>; using ll long long; const int mod 998244353; //当只有ab的时候,看作把a可以向右移动 //1 - x 是a 1 - y a //x中的 a 的 下标 < y 中 a 的下标 //这样就可以通过位移得到 …...
Lua05——Lua基本数据类型
lua 是动态类型语言,变量使用前不需要定义类型,在使用时直接赋值即可。 1 基本数据类型 值可以存储在变量中,作为参数传递或作为结果返回。 lua中有八个基本数据类型: nil 只有值nil属于该类,表示一个无效值&#…...
一文3000字从0到1使用pytest-xdist实现分布式APP自动化测试
目录 01、分布式测试的原理 02、测试项目 03、环境准备 04、搭建步骤 05、分布式执行 06、测试报告 不知道大家有没有遇到这样一种情况,实际工作中,app自动化测试的用例可能是成百上千条的,如果放在一台机器上跑,消耗的时间…...
pyqt5:pandas 读取 Excel文件或 .etx 电子表格文件,并显示
pip install pandas ; pip install pyqt5; pip install pyqt5-tools; 编写 pyqt5_read_etx.py 如下 # -*- coding: utf-8 -*- """ pandas 读取 Excel文件或 .etx 电子表格文件,显示在 QTableWidget 中 """ import os import sys…...
【QT】Windows 编译并使用 QT 5.12.7源码
1、下载 QT 源码 QT5.12.7源码下载地址: download | QT 5.12.7 选择任意一种下载即可,适用于 Windows 和 Linux 环境 这里选择下载 .zip 文件。 2、安装依赖 (1) 安装 perl perl 安装包下载地址: download | perl for windows 根据当前系统选择对应版本。…...
php实战案例记录(15)获取GET和POST请求参数
在PHP中,可以使用$_GET和$_POST超全局变量来获取GET和POST请求参数。 获取GET请求参数: 要获取GET请求参数,可以使用$_GET超全局变量。它是一个关联数组,其中键是参数的名称,值是参数的值。例如,如果URL是…...
k8s-9 ingress-nginx 特性
TLS加密 创建证书 测试 auth认证 创建认证文件 rewrite重定向 进入域名 会自动重定向hostname.html 示例二: 测试 后面必须跟westos 这个关键字 canary金丝雀发布 基于header灰度 场景:版本的升级迭代,比如一个service 升级到另…...
java案例24:模拟百度翻译
思路: 编写一个程序模拟百度翻译 用户输入英文之后,搜索程序中对应的中文, 如果搜索到1对应的中文,就输出搜索结果,反之给出提示 要求使用Map集合实现英文与中文的存储。1.百度翻译主要用于翻译对应的意思,…...
汽车烟雾测漏仪(EP120)
【汽车烟雾测漏仪(EP120)】 此烟雾测漏仪专为车辆管道(油道、气道、冷却管道) 的泄露检测而设计。适用于所有轻型 汽车、摩托车、轻卡、游艇等。 【特点】 具有空气模式和烟雾模式。空气模式,无需烟雾,检测…...
【轻松玩转MacOS】安全隐私篇
引言 这一篇将介绍如何保护MacOS的安全,包括如何设置密码,使用防火墙,备份数据等重要环节,避免因不慎操作或恶意攻击带来的安全风险,让你的MacOS之旅更安心、更放心。 一、设置密码:保护你的MacOS的第一道…...
4.02 用户中心-上传头像功能开发
详细内容请看下面地址: 地址:http://www.gxcode.top/code...
在Ubuntu 18.04安装Docker
安装需要的包 $ sudo apt-get update 安装 apt 依赖包,用于通过HTTPS来获取仓库 $ sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common添加 Docker 的官方 GPG 密钥 $ curl -fsSL https://download.do…...
Vue-2.1scoped样式冲突
默认情况:写在组件中的样式会全局生效->因此很容易造成多个组件之间的样式冲突问题 1.全局样式:默认组件中的样式会作用到全局 2.局部样式:可以给组件加上scoped属性,可以让样式只作用于当前组件 <style scoped> <…...
Matlab之查询子字符串在字符串中的起始位置函数strfind
一、功能 strfind函数用于在一个字符串中查找指定的子字符串,并返回子字符串在字符串中的起始位置。 二、语法 indices strfind(str, pattern) 其中,str是要进行查找的字符串,pattern是要查找的子字符串。 函数会返回一个由子字符串在字…...
[游戏开发][Unity]安卓出包报错记录
打包报错日志有以下几种类型: 报错: CommandInvokationFailure: Android Asset Packaging Tool failed. E:\Android-SDK-Tool\build-tools\33.0.2\aapt.exe package -v -f -F raw.ap_ -A raw -0 "" --ignore-assets "!.svn:!.git:!.ds_st…...
在两个有序数组中找整体第k小的数
一、题目 给定两个已经排序的数组(假设按照升序排列),然后找出第K小的数。比如数组A {1, 8, 10, 20}, B {5, 9, 22, 110}, 第 3 小的数是 8.。…...
Linux 指令心法(十)`head` 显示文本文件的开头部分
文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 head 是一个用于显示文本文件的开头部分的命令。它在 Linux 和 Unix 系统中非常有用,因为它允许用户查看文件的前几行,以便快速预览文…...
前端——Layui的导航栏与tab页联动
一、body <!-- 导航栏 --><div class"layui-side layui-bg-black"><div class"layui-side-scroll"><ul id"nav" class"layui-nav layui-nav-tree" lay-filter"stock"><li class"layui-n…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
