重学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.rhkb.cn/news/330103.html

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

相关文章

响应式处理-一篇打尽

纯pc端响应式 pc端平常用到的响应式布局 大致就如下三种&#xff0c;当然也会有其他方法&#xff0c;欢迎评论区补充 将div height、width设置成100% flex布局 flex布局主要是将flex-wrap: wrap&#xff0c; 最后&#xff0c;你可以通过给子元素设置 flex 属性来控制它们的…

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

【30天精通Prometheus:一站式监控实战指南】第4天:node_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…

绿联硬盘数据恢复方法:安全、高效找回珍贵数据

在数字化时代&#xff0c;硬盘承载着大量的个人和企业数据&#xff0c;一旦数据丢失或损坏&#xff0c;后果往往不堪设想。绿联硬盘以其稳定的性能和良好的口碑赢得了众多用户的信赖&#xff0c;但即便如此&#xff0c;数据恢复问题仍然是用户可能面临的一大挑战。本文将为您详…

炫酷网页设计:HTML5 + CSS3打造8种心形特效

你以为520过去了&#xff0c;你就逃过一劫了&#xff1f;那不是还有分手呢&#xff0c;那不是还得再找对象呢&#xff0c;那不是还有七夕节呢&#xff0c;那不是还有纪念日呢&#xff0c;那不是还有各种各样的节日呢&#xff0c;所以呀&#xff0c;这8种HTML5 CSS3打造8种心形…

Java 程序的基本结构,编写和运行第一个Java程序(Hello World)!

Java程序的基本结构 Java是一种面向对象的编程语言&#xff0c;其程序结构较为规范。Java程序由一个或多个类组成&#xff0c;每个类包含数据成员和方法。 1. 包声明&#xff08;Package Declaration&#xff09; 包是Java中组织类的一种机制&#xff0c;使用包可以避免类名…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

【Django】从零开始学Django(持续更新中)

pip install Djangopython manage.py startapp index运行&#xff1a; 成功&#xff01;&#xff01;&#xff01; 在templates中新建index.html文件&#xff1a;

SpringBoot搭建Eureka注册中心

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 1、Spring-Cloud Euraka介绍 Spring-Cloud Euraka是Spring Cloud集合中一…

linux系统CPU持续飙高的排查方法

目录 前言&#xff1a; 1、查看系统cpu使用情况 2、找出占用cpu高的进程 3、进一步分析进程占用的原因&#xff01;&#xff01;&#xff01; 4、解决办法 前言&#xff1a; 如果一台服务器&#xff0c;它的cpu使用率一直处于一个高峰值&#xff0c;此时服务器可能导致无…

【数据结构与算法】之堆及其实现!

目录 1、堆的概念及结构 2、堆的实现 2.1 堆向下和向上调整算法 2.2 堆的创建 2.3 建堆时间复杂度 2.4 堆的插入 2.5 堆的删除 2.6 完整代码 3、完结散花 个人主页&#xff1a;秋风起&#xff0c;再归来~ 数据结构与算法 个人格言&#…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件&#xff1a;HDFS文件系统元数据的一个永久性的检查点&#xff0c;其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件&#xff1a;存放HDFS文件系统的所有更新操作的路径&#xff0c;文件系统客户端执行的所有写操作首先 会被记录到Ed…

【状态压缩dp】最短Hamilton路径

题意&#xff1a; 从0开始&#xff0c;必须走完全部节点&#xff0c;且不重复走&#xff0c;不漏走的最短距离 关键思路&#xff1a; 从0开始 走到j 节点所走情况是 state【state表示经过的点&#xff0c;不代表顺序&#xff0c;就表示经过的点】 f[i][j]表示 从0开始 走到j…

经纬恒润第三代重载自动驾驶平板车

随着无人驾驶在封闭场地和干线道路场景的加速落地&#xff0c;港口作为无人化运营的先行者&#xff0c;其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。经纬恒润作为无人驾驶解决方案提供商&#xff0c;见证了港口在无人化运营方面的尝试及发展&#xff0c;并深度参…

Python——基于共享单车使用量数据的可视化分析(1)

目录 &#x1f9fe; 1、数据集&#xff08;部分数据&#xff09; ✏️ 2、导入数据集与必要模块 1️⃣ 2.1 导入库以及字体包 2️⃣ 2.2 读取数据集 3️⃣ 2.3 查看数据集基本信息 ⌨️ 3、数据预处理 1️⃣ 3.1删除无关字段 2️⃣ 3.2对各字段进行中文标识 3️⃣ 3.3…

go mod模式下,import gitlab中的项目

背景 为了go项目能够尽可能复用代码&#xff0c;把一些公用的工具类&#xff0c;公用的方法等放到共用包里统一管理。把共用包放到gitlab的私有仓库中。 遇到的问题 通过https方式&#xff0c;执行go get报了错误。 通过ssh方式&#xff0c;执行go get报了错误。 修改配置&am…

Linux备份服务及rsync企业备份架构(应用场景)

备份服务概述 备份服务:需要使用到脚本,打包备份,定时任务. 备份服务:rsyncd服务,不同主机之间数据传输. 特点&#xff1a; rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&#xff1a; 全量 &#xff1a;无论多少数据全部推…

研发机构大数据迁移如何保障敏感数据不泄露

随着云计算和大数据技术的飞速进步&#xff0c;越来越多的企业正试图通过数据迁移来提升IT基础设施的效率&#xff0c;减少成本&#xff0c;并增强业务的灵活性。但是&#xff0c;这一过程并非没有它的挑战&#xff0c;尤其是在数据安全方面。数据在转移过程中可能会遭遇黑客攻…

光伏企业都在用的户用光伏管理软件——鹧鸪云

随着全球对可再生能源和清洁能源的需求日益增长&#xff0c;光伏产业作为其中的佼佼者&#xff0c;正迎来前所未有的发展机遇。然而&#xff0c;随着光伏电站规模的扩大和分布范围的增加&#xff0c;如何高效、智能地管理这些电站&#xff0c;确保它们稳定、安全地运行&#xf…

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了&#xff0c;重新安装后遇到的错误记录如下&#xff1a; Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …