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

Java三种创建多线程的方法

线程是什么:

进程是程序的一次动态执行的过程,线程是进程中执行运算最小单位,一个进程在其执行过程中可以产生多个线程,而线程必须在某个进程内执行。

如果在一个进程中同时运行了多个线程(必须包含一个主线程),用来完成不同的工作,则称之为“多线程”多个线程交替占用CPU资源,而非真正的并行执行

主线程:

main()方法即为主线程入口

产生其他子线程的线程

必须最后完成执行,因为它执行各种关闭动作

一、创建线程的三种方法:

1.Thread类创建线程

继承Thread类,重写run()方法线程要执行的操作放在run()方法中,通过调用start()方法来启动线程start()方法只属于Thread类

注意:创建线程对象时不会执行线程,必须调用线程对象的start方法才能使线程开始

线程每次执行时长由分配的CPU时间片长度决定

主线程:
public class TestThread {public static void main(String[] args) {//查看主线程Thread thread = Thread.currentThread();System.out.println(thread.getName());//启动子线程MyThread myThread = new MyThread();myThread.start();}
}

子线程:
public class MyThread extends Thread{@Overridepublic  void run(){for (int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+"==="+i);}}
}

查看线程名字:

查看线程名:Thread.currentThread().getName()

这里的currentThread()是静态方法

public static void main(String[] args) {//查看主线程Thread thread = Thread.currentThread();System.out.println(thread.getName());//或者System.out.println( Thread.currentThread().getName());}

直接调用run()和start()区别:

使用run( )方法

同步执行,只有主线程一条执行路径

使用star( )方法

异步执行,多条执行路径,主线程和子线程并行交替执行

  • 直接调用run()就是同步执行,main方法会等run方法执行完以后才会执行下面的操作;
  • 调用star()方法可以实现异步执行,由线程调度器决定先执行main方法还是run方法,不是由程序代码中的 start() 调用的顺序直接决定的。

同步和异步:

也就是说一个程序需要运行完了有结果了才能进行下一个线程,这样这个程序就会堵塞其他的程序,这就是同步异步就是这个程序在运行的时候我仍然可以不管他运行别的程序

多线程可以将同步程序变为异步的,从而增加系统资源的利用率

2.Runnable接口创建线程:

因为Thread是单根继承,继承Thread之后不能够继承其他的类了。使用Runnable接口可以解决这个问题。

Runnable接口中声明了一个run()方法,即public void run()。

例子:使用Runnable接口创建线程

1.实现Runnable接口,并且实现Runnable接口的run()方法

2.创建Thread类对象,使用Runnable接口实现类的对象作为构造方法的参数 Thread td = new Thread(new Test02());

3.调用start方法

子线程:
public class MyRunnalbe  implements Runnable{@Overridepublic  void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "===" + i);}}
}

主线程:

注意:这个start方法是Thread类独有的

所以要创建一个thread对象,把myRunnalbe装进去

public class TestRunnable {public static void main(String[] args) {MyRunnalbe myRunnalbe = new MyRunnalbe();Thread thread = new Thread(myRunnalbe);thread.start();}
}

3.Callable接口创建线程:

首先介绍一下这个接口:

  1. 它需要重写call方法,而不是run了,
  2. 并且call()方法有返回值String,用futureTask.get()来接收返回值
  3. 它是一个泛型,默认返回为Object,可以在泛型中设置想要返回的类型

主程序:
public class TestMyCallable {public static void main(String[] args) {MyCallable myCallable = new MyCallable();FutureTask<String> futureTask = new FutureTask<>(myCallable);Thread thread = new Thread(futureTask);thread.start();//接收返回值try {System.out.println(futureTask.get());} catch (Exception e) {e.printStackTrace();}}
}

子线程:
public class MyCallable implements Callable<String> {@Overridepublic String call() throws Exception {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName() + "===" + i);}return "蛋蛋最牛掰";}
}

相关文章:

Java三种创建多线程的方法

线程是什么&#xff1a; 进程是程序的一次动态执行的过程&#xff0c;线程是进程中执行运算最小单位&#xff0c;一个进程在其执行过程中可以产生多个线程&#xff0c;而线程必须在某个进程内执行。 如果在一个进程中同时运行了多个线程&#xff08;必须包含一个主线程&#…...

828华为云征文 | 云上私人数据管家,jMalCloud个人网盘在华为云Flexus的Docker化部署实践

华为云服务器Flexus X实例介绍 华为云Flexus云服务器X实例&#xff0c;是由国家科技进步奖获得者、华为公司Fellow、华为云首席架构师顾炯炯牵头研发。它基于擎天QingTian架构、瑶光云脑、盘古大模型等根技术创新&#xff0c;是业界首款应用驱动的柔性算力云服务器&#xff0c;…...

C# 开源教程带你轻松掌握数据结构与算法

目录 前言 项目介绍 项目特点 项目展示 1、内容导图 2、部分目录 3、源码示例 项目地址 最后 前言 在项目开发过程中&#xff0c;理解数据结构和算法如同掌握盖房子的秘诀。算法不仅能帮助我们编写高效、优质的代码&#xff0c;还能解决项目中遇到的各种难题。 给大家…...

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(五)

概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0 版本。其新加入的历史记录追踪(History Trace)机制着实让秃头码农们“如痴如醉”了一番。 我们在之前的博文中已经介绍了 History Trace 是如何处理数据新增操作的。而在这里,我们将再接再厉来完成数据删除时的全盘…...

python爬虫基础:了解html

编辑器vscode <!DOCTYPE html> <html><head><title>第一个网页</title></head><body><h1>字体</h1><h2>字体</h2><h3>字体</h3><p>Lorem, ipsum dolor sit amet consectetur adipisicing…...

spring security OAuth2 客户端接入gitee

一、简介 OAuth 是一个开放标准&#xff0c;该标准允许用户让第三方应用访问该用户在某一网站上存储的私密资源(如头像、照片、视频等)&#xff0c;并且在这个过程中无须将用户名和密码提供给第三方应用。通过令牌(token)可以实现这一功能&#xff0c;每一个令牌授权一个特定的…...

阿里云镜像报错 [Errno 14] HTTP Error 302 - Found 问题解决记录

1、问题背景和解决思路 在本地安装 CentOS7 后&#xff0c;网络已调通可正常上网&#xff0c;但切换阿里云镜像后&#xff0c;使用 yum 安装软件时出现 “[Errno 14] HTTPS Error 302 - Found Trying other mirror.” 报错&#xff0c;原因是 yum 源配置问题。给出了详细的解决…...

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…...

深入剖析嵌套调用和链式访问,以及函数的声明和定义(超全面覆盖)

1. 前情提要 在上一篇博客中&#xff0c;我们大致了解了函数的种类&#xff0c;以及自定义函数中形参和实参的具体区别 我们知道实参是需要传递给形参的&#xff0c;但其实形参和实参占据的是完全独立的内存空间 x&#xff0c;y在执行过程中会得到a和b的值&#xff0c;但是x…...

浏览器百科:网页存储篇-IndexedDB介绍(十)

1.引言 在现代网页开发中&#xff0c;数据存储需求日益增多和复杂&#xff0c;传统的客户端存储技术如localStorage和sessionStorage已难以满足大型数据的存储和管理需求。为了解决这一问题&#xff0c;HTML5 引入了 IndexedDB&#xff0c;在本篇《浏览器百科&#xff1a;网页…...

Java语言程序设计基础篇_编程练习题*18.22 (将十进制數转换为十六进制数)

题目&#xff1a;*18.22 (将十进制數转换为十六进制数) 编写一个递归方法&#xff0c;将一个十进制数转换为一个十六进制数的字符串。方法头如下: public static String dec2Hex(int value)编写一个测试程序&#xff0c;提示用户输入一个十进制数&#xff0c;然后显示等价的十…...

蓝桥杯3. 压缩字符串

题目描述 实现一个算法来压缩一个字符串。压缩的要求如下&#xff1a; 需要判断压缩能不能节省空间&#xff0c;仅在压缩后字符串比原字符串长度更短时进行压缩。 压缩的格式是将连续相同字符替换为字符 数字形式&#xff0c;例如 "AAABCCDDDD" 变为 "A3BC2D…...

Java设计模式之责任链模式详细讲解和案例示范

在本文中&#xff0c;我们将详细讲解Java设计模式中的责任链模式&#xff0c;探讨其基本概念、使用场景、常见问题和解决方式。同时&#xff0c;我们还会介绍责任链模式与策略模式的区别&#xff0c;并结合电商交易系统的示例进行说明。此外&#xff0c;我们还会探讨责任链模式…...

ubuntu_如何解决apt install时报错:Waiting for cache lock: Could not get lock

当你在 Ubuntu 上运行 apt 时&#xff0c;遇到类似 Waiting for cache lock: Could not get lock 错误&#xff0c;通常是因为另一个进程正在使用 apt 或者类似的包管理器工具。你可以按照以下步骤来查找并解决这个问题&#xff1a; 1. 查询哪个进程正在使用锁 系统中的锁文件…...

软件测试(D5)

步骤&#xff1a; 设计测试-->发现缺陷-->测试报告 Day1 target 1.复述软件测试的定义 2.7种软件测试分类的区别 3.质量模型的重点5项 4.测试流程的6个步骤 5.测试模板的8个要素 认识软件及测试 软件&#xff1a; 控制硬件的工具 应用软件系统软件&#xff0…...

CSS 圆角渐变边框

<div class"contact-box"><div class"contact-item">联系我们</div> </div>.contact-item{width: 194px;height: 48px;border-radius: 20px 20px 20px 20px;background-color: #000000;color: #BDBDBD;font-weight: 500;font-size…...

骑砍2霸主MOD开发(26)-使用TrfExporterBlender制作TRF文件

一.Blender导入TRF文件 import bpytrf_meshes = []trf_contents = []trf_import_path = D:\pt_ladder.trftrf_export_path = D:\pt_ladder_morph_keys.trfclass TrfMesh:def __init__(self):self.mesh_name = self.mesh_materials = []self.vertex_cnt = 0self.vertex_fvf_cnt…...

Leetcode 最大子数组和

使用“Kadane’s Algorithm”来解决。 Kadane’s Algorithm 在每个步骤中都保持着一个局部最优解&#xff0c;即以当前元素为结尾的最大子数组和(也就是局部最优解)&#xff0c;并通过比较这些局部最优解和当前的全局最优解来找到最终的全局最优解。 Kadane’s Algorithm的核…...

目标检测-YOLOv2

YOLOv2介绍 YOLOv2&#xff08;You Only Look Once version 2&#xff09;是一种用于目标检测的深度学习模型&#xff0c;由Joseph Redmon等人于2016年提出&#xff0c;并详细论述在其论文《YOLO9000: Better, Faster, Stronger》中。YOLOv2在保持高速检测的同时&#xff0c;显…...

大数据 - OLAP与OLTP的区别

前言 联机事务处理OLTP&#xff08;on-line transaction processing&#xff09;和 联机分析处理OLAP&#xff08;On-Line Analytical Processing&#xff09;。 OLTP&#xff0c;主要是面向传统的“增删改查”事务系统&#xff0c;数据大都是以实体对象模型来存储数据&#…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...