重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light

                                                                                               —— 24.5.24

一、第一种方式_继承extends Thread方法

1.定义一个类,继承Thread
2.重写run方法,在run方法设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码)
3.创建自定义线程类的对象
4.调用Thread中的start方法,开启线程,jvm自动调用run方法

package S64thread;public class Demo195Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println("Mythread执行了"+i);}}
}
package S64thread;public class Demo196Test {public static void main(String[] args) {// 创建线程对象Demo195Mythread t1 = new Demo195Mythread();// 调用start方法,开启线程,jvm自动调用run方法,只有调用start才会开启线程,二者一同执行// t1.run();t1.start();for (int i = 0; i < 10; i++) {System.out.println("main线程执行了"+i);}}
}

二、多线程在内存中的运行原理 

        注意:同一个线程对象不能连续调用多次start,如果想要再次调用start,那么咱们就new一个新的线程对象

三、Thread类中的方法

package S65threadMethod;public class Demo197Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(getName()+"执行了"+i);}}
}
package S65threadMethod;public class Demo198Test {public static void main(String[] args) {// 创建线程对象Demo197Mythread t1 = new Demo197Mythread();// 给线程设置名字t1.setName("赵四");// 调用start方法,开启线程,jvm自动调用run方法,只有调用start才会开启线程,二者一同执行// t1.run();t1.start();for (int i = 0; i < 10; i++) {System.out.println("main线程执行了"+i);}}
}

void start() -> 开启线程,jvm自动调用run方法

void run() -> 设置线程任务,这个run方法是Thread重写的接口Runnable中的run方法

String getName() -> 获取线程名字
void setName(string name) -> 给线程设置名字
static Thread currentThread() -> 获取正在执行的线程对象(此方法在哪个线程中使用,获取的就是哪个线程对象

static void sleep(long millis) -> 线程睡眠超时后会自动醒来继续执行,传递的是毫秒值,睡眠时不会影响其他线程,其他线程会直接运行完,不会等待

package S65threadMethod;public class Demo197Mythread extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {// 线程睡眠try{// 线程sleep后一顿一顿的执行Thread.sleep(1000L);}catch (InterruptedException e){throw new RuntimeException(e);}// 链式调用 currentThread 获取正在执行的线程对象System.out.println(Thread.currentThread().getName()+"线程执行了"+i);}}
}
package S65threadMethod;public class Demo198Test {public static void main(String[] args) {// 创建线程对象Demo197Mythread t1 = new Demo197Mythread();// 给线程设置名字 线程一顿一顿的执行t1.setName("赵四");// 调用start方法,开启线程,jvm自动调用run方法,只有调用start才会开启线程,二者一同执行// t1.run();t1.start();for (int i = 0; i < 10; i++) {// 链式调用System.out.println(Thread.currentThread().getName()+"线程执行了"+i);}}
}

问题:为啥在重写的run方法有异常只能try,不能throws

原因:继承的 Thread中的run方法 没有抛异常,所以在子类中重写完run方法之后就不能抛,只能try…catch

四、thread中的其他方法

1.线程优先级

        ① void setPriority(int newPriority) —— 设置线程优先级,优先级越高的线程,抢到CPU使用权的几率越大,但是不是每次都先抢到

        ② int getPriority() —— 获取线程优先级

package S66thread;import S65threadMethod.Demo197Mythread;public class Demo200Test {public static void main(String[] args) {// 创建两个线程对象Demo199Mythread1 t1 = new Demo199Mythread1();t1.setName("金莲");Demo199Mythread1 t2 = new Demo199Mythread1();t2.setName("阿庆");// 获取两个线程的优先级 5是一个默认优先级/*获取两个线程的优先级MIN_PRIORITY=1 最小优先级 1NORM_PRIORITY=5 默认优先级 5MAX_PRIORITY=10 最大优先级 10*/System.out.println(t1.getPriority());System.out.println(t2.getPriority());// 设置优先级t1.setPriority(1);t2.setPriority(10);System.out.println(t1.getPriority());System.out.println(t2.getPriority());t1.start();t2.start();}
}

2.守护线程

        ③ void setDaemon(boolean on) —— 设置为守护线程,当非守护线程执行完毕,守护线程就要结束,但是守护线程也不是立马结束,当守护线程结束之后,系统会告诉守护线程人家结束了,你也结束吧,在告知的过程中,守护线程会执行,只不过执行到半路就结束了

package S67ProtectThread;public class Demo201MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"执行了......"+i);}}
}
package S67ProtectThread;public class Demo203MyThread2 extends Thread{@Overridepublic void run(){for (int i = 0; i < 99; i++) {System.out.println(Thread.currentThread().getName()+"执行了..."+i);}}
}
package S67ProtectThread;public class Demo202Test {public static void main(String[] args) {// 创建两个线程对象Demo201MyThread1 t1 = new Demo201MyThread1();t1.setName("金莲");Demo203MyThread2 t2 = new Demo203MyThread2();t2.setName("阿庆");// 将t2设置为守护线程t2.setDaemon(true);t1.start();t2.start();}
}

使用场景:

3.礼让线程

让两个线程尽可能的平衡一点->尽量让两个线程交替执行

        ④ static void yield() —— 礼让线程,让当前线程让出CPU使用权
场景说明:如果两个线程一起执行,可能会执行一会儿线程A,再执行一会线程B,或可能线程A执行完毕了,线程B在执行

注意:只是尽可能的平衡,不是绝对的平衡,有可能在礼让线程之后又抢到了CPU使用权

package S68PoliteThread;public class Demo204MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了..."+i);// 礼让线程Thread.yield();}}
}
package S68PoliteThread;public class Demo205Test {public static void main(String[] args) {// 创建两个线程对象Demo204MyThread1 t1 = new Demo204MyThread1();t1.setName("金莲");Demo204MyThread1 t2 = new Demo204MyThread1();t2.setName("阿庆");// 礼让线程Thread.yield();t1.start();t2.start();}
}

     

4.插入线程      

⑤ void join() —— 插入线程或者叫做插队线程

package S69InsertThread;public class Demo206MyThread1 extends Thread{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了..."+i);// 插入线程}}
}
package S69InsertThread;public class Demo207Test {public static void main(String[] args) throws InterruptedException {// 创建两个线程对象Demo206MyThread1 t1 = new Demo206MyThread1();t1.setName("金莲");t1.start();// 插入线程 表示把t1插入到当前线程之前t1.join();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了..."+i);// 插入线程}t1.start();}
}

五、第二种方式_实现Thread中的Runnable接口

Thread中的run方法重写的Runnable中的接口,可以直接实现Runnable接口

1.创建类,实现Runnable接口
2.重写run方法,设置线程任务
3.利用Thread类的构造方法:Thread(Runnable target),创建Thread对象(线程对象),将自定义的类当参数传递到Thread构造中 —> 这一步是让我们自己定义的类成为一个真正的线程类对象

4.调用Thread中的start方法,开启线程,jvm虚拟机自动调用run方法

package S70ThreadRunnable;public class MyRunnable implements Runnable{@Overridepublic void run(){for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了"+i);}}
}
package S70ThreadRunnable;public class Demo208Test {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();//        Thread(Runnable target)Thread t1 = new Thread(myRunnable);// 调用Thread中的start方法,开启线程t1.start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了"+i);}}
}

六、两种实现多线程的方式区别

1.继承Thread:继承只支持单继承,有继承的局限性
2.实现Runnable:没有继承的局限性,MyThread extends Fu implements Runnable

七、匿名内部类方式创建多线程

        严格意义上来说,匿名内部类方式不属于创建多线程方式其中之一,因为匿名内部类形式建立在实现Runnable接口的基础上完成的

        匿名内部类回顾:
                1.new 接口/抽象类(){

                        重写方法

                  }.重写的方法();
                2.接口名/类名对象名 = new 接口/抽象类(){

                        重写方法

                  }        
                  对象名.重写的方法();

匿名内部类给线程取名
Thread(Runnable target,string name)

        name指的是给匿名内部类中的线程设置名字

package S70ThreadRunnable;public class Demo209Test02 {public static void main(String[] args) {/*Thread(Runnable r)*/new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了"+i);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName()+"...执行了"+i);}}}).start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于灰狼优化算法优化支持向量机(GWO-SVM)回归预测

代码原理 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的回归预测代码的原理和流程如下&#xff1a; 1. **初始化灰狼群体**&#xff1a;随机生成一定数量的灰狼&#xff0c;并初始化它们的位置和速度。 2. **初始化SVM模型参数**&#xff1a;根据问题要…

【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1. 网络编程 1.1 概述 1.2 网络编程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和协议 1.3 UDP协议 1.3.1 UDP发送数据 1.3.2 UDP接收数据 1.4…

C语言——小知识和小细节18

一、力扣题目 1、题目本体 2、题解 本题目我们使用异或分组的方法来解决。可以在我之前的文章《C语言——操作符CSDN博客》中看一下异或的特点。 由于异或的运算规则为相同为0&#xff0c;不同为1&#xff0c;而且是在二进制补码上进行操作的&#xff0c;我们可以发现的一个…

c++|多态

c|多态 1 多态的概念2 多态的定义及其实现2.1 满足多态的条件2.2 虚函数2.3 虚函数的重写2.4 析构函数适合加virtural吗2.4 C11 override 和 final2.5 三个概念的对比 3 多态的原理4 抽象类4.1 概念4.2 纯虚函数 1 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是…

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求&#xff1a;1&#xff09;将业务代码与非业务代码分离&#xff0c;在不改变代码结构的基础上&#xff0c;为其添加新的功能。2&#xff09;为系统中的某些操作做同一处理&#xff0c;例如进…

[实例] Unity Shader 逐像素漫反射与半兰伯特光照

漫反射光照是Unity中最基本最简单的光照模型&#xff0c;本篇将会介绍在片元着色器中实现反射效果&#xff0c;并会采用半兰伯特光照技术对其进行改进。 1. 逐顶点光照与逐像素光照 在Unity Shader中&#xff0c;我们可以有两个地方可以用来计算光照&#xff1a;在顶点着色器…

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…

【最新区块链论文录用资讯】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;网络与信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系统的有效…

基于python的网页自动刷新工具

1.下载webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下载Edge的浏览器驱动 2.安装selenium pip install selenium4.11.1 3.写代码 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 实现平移和缩放 彻悟版

背景 之前写了一篇关于set_part 的文章 &#xff0c;确实也实现了平移和缩放。平移是对的&#xff0c;但是缩放其实有畸变。这个问题一直都困扰着我&#xff0c;知道昨天连续测试了好几个小时&#xff0c;直到晚上11点终于完美解决。 坐标和高宽 坐标 再讲set_part 之前&am…

免费撸gpt-4o和各种大模型实用经验分享

项目 Github: https://github.com/MartialBE/one-api 先贴两张图&#xff1a; 说明 免费撸AI大模型,各位可以对照下面我给出的大模型记录表来填&#xff0c;key需要自己去拿&#xff0c;国内都需要手机号验证&#xff0c;如果你不介意。另外我在自己的博客放出免费API给大家…

模型评价指标笔记:混淆矩阵+F1+PR曲线+mAP

评价指标 二分类评价指标 混淆矩阵 TP: 正确预测为了正样本&#xff0c;原来也是正样本 FN: 错误的预测为负样本&#xff0c;原来是正样本 (漏报&#xff0c;没有找到正确匹配的数目) FP: 错误的预测为正样本&#xff0c;原来是负样本 (误报&#xff0c;没有的匹配不正确) TN…

CIM模型

CIM 是 Esri 制图信息模型。 它是一个地图内容规范,用于记录在保存、读取、引用或打开时如何永久保留描述不同项目组件的信息。 该规范以 JSON 表示,适用于 ArcGIS 应用程序和 API 中的地图、场景、布局、图层、符号和样式。 CIM 不仅限于制图设置。 要了解属性的组织方式以及…

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段&#xff0c;后端创建对应的实体类的时间属性需要设定格式&#xff08;默认的格式不方便阅读&#xff09;&#xff0c;再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…

Vue.js - Vue 的安装 以及 常用的 Vue 指令 【0基础向 Vue 基础学习】

文章目录 Vue 快速上手1、Vue.js 官网 & Vue.js 的获取2、创建 Vue 实例&#xff0c;初始化渲染3、插值表达式 安装 Vue 开发者工具&#xff1a;装插件调试 Vue 应用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 调用传参 5、v-bindv-bind 对于样式…

【算法】前缀和算法——和为k的子数组之和

题解&#xff1a;和为k的子数组之和(前缀和算法) 目录 1.题目2.题解思路2.1前缀和 哈希表&#xff0c;算法步骤&#xff1a;2.2细节如下&#xff1a;2.3参考代码&#xff1a; 3.总结及思考 1.题目 题目链接&#xff1a;LINK 2.题解思路 暴力求解自然不用多说&#xff0c;时…

【SQL】外连接 LEFT JOIN

目录 一.内连接与外连接 1.内连接&#xff08;inner join&#xff09; 2.外连接&#xff08;outer join&#xff09; 二.两表连接 1.我们先来试试看内连接&#xff1a; 2.我们再来试试外连接 三.单表外连接 四.总结 一.内连接与外连接 先得介绍内连接和外连接两个概念&…

第199题|关于函数的周期性问题|函数强化训练(六)|武忠祥老师每日一题 5月24日

解题思路&#xff1a;解这道题我们要用到下面这个结论 f(x)连续&#xff0c;以T为周期时&#xff0c;原函数以T为周期的充分必要条件是&#xff1a; (A) sin x显然是以π为周期的&#xff0c;我们可以看到并不等于0,根据结论&#xff0c;A的原函数显然不是周期函数。 (B) 的…

你以为的私域是真正的私域嘛??你的私域流量真的属于你嘛?

大家好 我是一个软件开发公司的产品经理 专注私域电商行业7年有余 您的私域流量是真正的属于你自己嘛&#xff1f; 私域的定义 私域的界定&#xff1a;一个互联网私有数据&#xff08;资产&#xff09;积蓄的载体。这个载体的数据权益私有&#xff0c;且具备用户规则制定权…

Mysql 备份恢复 mysqldump与xtrabackup备份

1.1 备份的原因 备份是数据安全的最后一道防线&#xff0c;对于任何数据丢失的场景&#xff0c;备份虽然不一定能恢复百分之百的数据 (取决于备份周期)&#xff0c;但至少能将损失降到最低。衡量备份恢复有两个重要的指标&#xff1a;恢复点目标(RPO) 和恢复时间目标(RTO)&…