(一)创建线程的三种方式

news/2024/4/16 4:00:37

(一)创建线程的三种方式

  • 1.1 线程与进程
  • 1.2 创建线程的三种方式
    • 01、继承Thread类
    • 02、实现Runnable接口
    • 03、实现Callable接口
  • 1.3 Question?
    • 01、为什么要重写 run() 方法?
    • 02、run() 方法和 start() 方法有什么区别?
    • 03、通过继承 Thread 类和实现 Runnable 接口的方式创建多线程,哪个好?
  • 1.4 三个常见的方法
    • 01、sleep()
    • 02、join()
    • 03、setDaemon()
  • 1.5 线程的生命周期

1.1 线程与进程

起初刚接触线程与进程的时候,一直傻傻分不清,是因为这两个概念一直都是死记硬背的,并没有完全理解,比如:

  • 进程:是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。
  • 线程:是进程的子任务,是 CPU 调度和分派的基本单位,实现了进程内部的并发。

显然,这些概念是很抽象的。我们可以打个比方,如图所示:

  • 进程:我打开一个浏览器就相当于一个进程。
  • 线程:可以比作是浏览器中打开的 n 个页面。
    在这里插入图片描述
    一个进程可以有多个线程就叫做多线程。

搞清楚了两者的区别后,需要知道以下几点:

  1. 线程在进程下进行(打开浏览器之后才能有页面)
  2. 进程之间不会相互影响,主线程结束会导致整个进程结束(关闭浏览器,所有页面都将会被关闭)
  3. 不同的进程数据很难共享(不同的浏览器搜索的内容并不完全相同)
  4. 同进程下的不同线程之间数据很容易共享(同一个浏览器中可以看到历史浏览页面)
  5. 进程使用内存地址可以限定使用量(每种浏览器都有打开页面数量的上限)

1.2 创建线程的三种方式

01、继承Thread类

创建一个类实现 Thread 类,并重写 run() 方法:

/*** 创建线程的三种方式-继承Thread类* * @author qiaohaojie* @date 2023/6/29  16:25*/
public class CreateThreadTest {public static void main(String[] args) {/*** 01 继承Thread类*/// 1. 模拟三个线程CreateThread01 thread1 = new CreateThread01();CreateThread01 thread2 = new CreateThread01();CreateThread01 thread3 = new CreateThread01();// 2. 手动设置每个线程的名字thread1.setName("青花椒一号");thread2.setName("青花椒二号");thread3.setName("青花椒三号");// 3. 开启线程thread1.start();thread2.start();thread3.start();}static class CreateThread01 extends Thread {@Overridepublic void run() {for (int i = 0; i < 100; i++) {System.out.println(getName() + ":打了" + i + "个小兵");}}}
}

运行结果:
在这里插入图片描述

02、实现Runnable接口

创建一个类实现 Runnable 接口,并重写 run() 方法:

/*** 创建线程的三种方式-实现Runnable接口** @author qiaohaojie* @date 2023/6/29  16:25*/
public class CreateThreadTest {public static void main(String[] args) {/*** 02 实现Runnable接口*/// 1. 创建CreateThread02类CreateThread02 runnable = new CreateThread02();// 2. 模拟三个线程Thread thread4 = new Thread(runnable, "青花椒四号");Thread thread5 = new Thread(runnable, "青花椒五号");Thread thread6 = new Thread(runnable, "青花椒六号");// 3. 开启线程thread4.start();thread5.start();thread6.start();}static class CreateThread02 implements Runnable {@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {// sleep会发生异常,要显示处理Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "打了:" + i + "个小兵");}}}
}

运行结果:
在这里插入图片描述

03、实现Callable接口

创建一个类实现 Callable 接口,重写 call() 方法,这种方式可以通过FutureTask获取任务执行的返回值。

/*** 创建线程的三种方式-实现Callable接口** @author qiaohaojie* @date 2023/6/29  16:25*/
public class CreateThreadTest {public static void main(String[] args) {/*** 03 实现Callable接口*/// 1. 创建CreateThread03类CreateThread03 createThread03 = new CreateThread03();// 2. 创建异步任务FutureTask<Integer> futureTask = new FutureTask<>(createThread03);// 3. 启动线程new Thread(futureTask).start();// 4. 返回程序执行结果try {System.out.println("执行结果:" + futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}static class CreateThread03 implements Callable<Integer> {@Overridepublic Integer call() throws Exception {Thread.sleep(2000);int sum = 0;for (int i = 0; i < 100; i++) {sum += i;}return sum;}}
}

运行结果:
在这里插入图片描述

1.3 Question?

01、为什么要重写 run() 方法?

因为 run() 方法是用来封装被线程执行的代码。

02、run() 方法和 start() 方法有什么区别?

  • run() 方法:封装线程执行的代码,直接调用相当于调用普通方法;
  • start() 方法:启动线程,然后由 JVM 调用此线程的 run() 方法。

03、通过继承 Thread 类和实现 Runnable 接口的方式创建多线程,哪个好?

实现 Runnable 接口好,原因有两个:

  1. 避免了 Java 单继承的局限性;
  2. 适合多个相同的程序代码去处理同一资源的情况,把线程、代码和数据有效的分离,更符合面向对象的设计思想。

1.4 三个常见的方法

针对线程控制,还会遇到三个常见的方法:

01、sleep()

使当前正在执行的线程暂停指定的毫秒数,也就是进入休眠的状态。使用时要对异常进行处理:

try {// sleep会发生异常要显示处理Thread.sleep(20);//暂停20毫秒
} catch (InterruptedException e) {e.printStackTrace();
}

02、join()

等待这个线程执行完才会轮到后续线程得到 cpu 的执行权,使用这个也要抛出异常:

/*** 02 实现Runnable接口*/
// 1. 创建CreateThread02类
CreateThread02 runnable = new CreateThread02();
// 2. 模拟三个线程
Thread thread4 = new Thread(runnable, "青花椒四号");
Thread thread5 = new Thread(runnable, "青花椒五号");
Thread thread6 = new Thread(runnable, "青花椒六号");
// 3. 开启线程
thread4.start();
try {// 等到thread4执行完才会轮到thread5和thread6thread4.join();
} catch (InterruptedException e) {e.printStackTrace();
}
thread5.start();
thread6.start();

运行结果:
在这里插入图片描述

03、setDaemon()

将此线程标记为守护线程,准确来说,就是服务其他的线程,像 Java 中的垃圾回收线程,就是典型的守护线程:

/*** 01 继承Thread类*/
// 1. 模拟三个线程
CreateThread01 thread1 = new CreateThread01();
CreateThread01 thread2 = new CreateThread01();
CreateThread01 thread3 = new CreateThread01();
// 2. 手动设置每个线程的名字
thread1.setName("青花椒一号");
thread2.setName("青花椒二号");
thread3.setName("青花椒三号");
// 标记守护线程
thread1.setDaemon(true);
thread2.setDaemon(true);
// 3. 开启线程
thread1.start();
thread2.start();
thread3.start();

如果其他线程都执行完毕,main() 方法也执行完毕,JVM 就会退出,也就是停止运行。如果 JVM 都停止运行了,守护线程自然也就停止了。

1.5 线程的生命周期

在这里插入图片描述


http://www.ppmy.cn/news/642063.html

相关文章

传统后端漏洞----(Web Server) 解析漏洞

笔记 前言IIS解析漏洞文件夹解析漏洞原理限制条件 ";" 分号截断漏洞原理 IIS解析漏洞检测IIS 文件夹解析漏洞检测IIS 分号截断漏洞检测 防御手段 Nginx解析漏洞Nginx 文件类型错误解析漏洞导致任意PHP代码执行原理Nginx 空字节解析漏洞导致任意文件可解析&#xff08…

ftp传输最后一直卡在最后10秒_U盘复制文件到最后5秒会卡住怎么办解决

现在的U盘容量已经非常大了&#xff0c;一般都有16G以上&#xff0c;为了能放单文件大于4G的数据大多数时候我们都是把U盘格式化为ntfs格式的&#xff0c;所以会出现不管是大文件还是小文件&#xff0c;当你往U盘里复制文件或者使用发送到U盘功能的时候会出现一个怪现象&#x…

mac u盘文件过大 拷贝不进去_mac文件太大无法复制到u盘怎么办 mac文件太大无法复制到u盘解决方法...

类型&#xff1a;Mac图形图像大小&#xff1a;23.3M语言&#xff1a;中文 评分&#xff1a;10.0 标签&#xff1a; 立即下载 mac文件太大无法复制到u盘怎么办&#xff1f;mac文件太大无法复制到u盘解决方法。最近很多用户在询问mac文件太大无法复制到u盘怎么办&#xff1f;有时…

小米盒子4用u盘导入html文件格式,最新图文教程:小米盒子怎么用U盘安装第三方应用...

小米盒子是最受用户欢迎的电视盒子&#xff0c;大家使用小米盒子看电影、看直播&#xff0c;而且还可以利用外设&#xff0c;玩酷炫的体感游戏。强大的硬件配置和丰富的软件资源&#xff0c;是小米盒子广受好评的法宝。但是由于收到诸多因素影响&#xff0c;并不是每位用户都懂…

【黑客技巧】插上U盘自动按需复制文件

小伙伴们注意&#xff1a;公众号的推送机制不再按照时间前后推送了&#xff0c;微信公众号信息流乱序。君哥建议大家把科技毒瘤君公众号置顶&#xff08;设为星标⭐&#xff09;&#xff0c;以便第一时间看到推送&#xff0c;非常感谢~&#xff0c;方法如下图&#xff1a; 文 章…

为什么下载小电影时,经常会卡在 99%?

点击关注公众号&#xff0c;回复“1024”获取2TB学习资源&#xff01; 下载最怕什么&#xff0c;那绝对是进度条&#xff1a;99%。 这是一个充满魔力的数字&#xff0c;曾让我狂躁、焦虑&#xff0c;甚至激动得想砸键盘锤电脑扔手机。 比如下载学习资料或看动作大片&#xff0c…

linux从u盘挂载yum源,利用U盘与163的yum源镜像网站安装Linux系统

各位攻城湿们&#xff01; 有没有遇到这样的情况&#xff1a;到现场部署、维护Linux系统时&#xff0c;发现服务器竟不再光驱&#xff0c;光驱损坏&#xff0c;自己随身USB光驱忘带&#xff0c;系统光盘忘带&#xff0c;系统盘损坏&#xff0c;光驱不带刻录&#xff0c;为装一次…

怎么修改u盘html格式的文件,如何实现U盘转为NTFS格式可传4G以上文件

说到日常的数据管理&#xff0c;我们就不得不提U盘了。毕竟作为比较便利的数据存储设备&#xff0c;其精致的外观&#xff0c;以及其相对较快的传输速率得到很多消费者的青睐。不过&#xff0c;很多朋友都会觉得U盘的安全以及访问速度不给力啊。那是因为普通U盘都是使用的FAT32…

linux什么系统以dd镜像写入,linux下使用dd命令写入镜像文件到u盘

1、使用 df -h ,查看一下当前各个磁盘 user@host ~/ $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 119G 79G 34G % / none .0K .0K % /sys/fs/cgroup udev .8G 12K .8G % /dev tmpfs .6G 1.1M .6G % /run none 5.0M 5.0M % /run/lock none .9G 1.5M .9G % /r…

完美者u盘linux,完美者u盘维护系统v10.2 完整终结版_完美者u盘维护系统2017官方下载|好特下载...

完美者u盘维护系统2017新版本做了诸多改变。 首先最明显的改变是增加了BIOSUEFI双启动。随着电脑技术不断的发展&#xff0c;越来越多的新电脑支持UEFI启动。完美者U盘维护系统三周年版增加了支持UEFI启动功能。 在老机器上可以默认以BIOS方式启动;在支持UEFI启动的新机器上可以…

为什么学校的计算机识别不出u盘,电脑读不出u盘是什么问题 为什么电脑不能识别u盘...

在生活中&#xff0c;U盘能给我们生活带来便利&#xff0c;用来拷贝电影、电视剧以及一些文档资料都非常方便&#xff0c;而U盘在使用过程中也常会出现电脑读不出数据的问题&#xff0c;那么电脑读不出u盘是什么问题&#xff0c;为什么电脑不能识别u盘呢&#xff0c;接下来随小…

小米盒子4用u盘导入html文件格式,小米盒子4应用装到U盘上,该怎么做?

与智能电视相比&#xff0c;智能电视盒具有许&#xff0c;例如移动灵活性和使用方便性。现在&#xff0c;大多数家庭拥有2台或更多电视。智能电视盒可以随时与其他电视一起使用。这种优势是智能电视无法比拟的&#xff0c;并且智能电视盒上有许多免费的电影和电视。资源&#x…

小米盒子4用u盘导入html文件格式,小米盒子4如何安装应用到U盘,一招彻底解决内存...

相对于智能电视来说&#xff0c;智能电视盒拥有移动灵活&#xff0c;使用方便等诸多特点。现在的家庭大多数都拥有2台或以上电视&#xff0c;可以随时将智能电视盒移动搭配不同的电视机使用&#xff0c;这个优势是智能电视无法比拟的&#xff0c;而且智能电视盒上拥有非常多的免…

mac u盘文件过大 拷贝不进去_Mac大文件无法复制到U盘怎么办

我们在处理一些比较大的文件时候,一般会采用用U盘的方法&#xff0c;因为u盘的方式比直接下载快很多,有一些在用Mac的朋友反应&#xff1a;他们在向U盘拷贝文件时总会遇到"文件太大,无法拷贝"的一个错误提示:那么今天,小编就解决这个问题出解决方法&#xff0c;希望能…

在2022年如何将整个维基百科下载到U盘中

在2022年如何将整个维基百科下载到U盘中 flash-drive 你有没有想过把整个维基百科下载到U盘中&#xff0c;用来离线访问&#xff1f; 经过几个小时的试错&#xff0c;我最终下载成功了&#xff0c;下面分享一下整个过程&#xff0c;还挺简单的。 跟着本文做下来&#xff0c;你就…

利用ubint安装Linux到u盘,Ubuntu12.04安装到U盘里

把linux安装到U盘里&#xff0c;随时随地使用自己的系统show一下不仅用起来顺手而且很方便携带。看了一些关于安装Ubuntu到U盘的资料&#xff0c;自己试着折腾了几次&#xff0c;并且成功安装了。花时间更新要保证系统是最新的就要定时。废话不说了&#xff0c;就分享一下把&am…

vtk创建圆柱体

vtk创建圆柱体 引言开发环境示例运行效果 引言 本文记录使用vtk创建一个圆柱体。 开发环境 使用QtCreator4.11.2创建一个空项目&#xff0c;使用的vtk9.2的库和头文件&#xff0c;基于Qt5.14.2。 示例 这里提供pro文件中的内容和main.cpp中的内容。内容如下&#xff1a; .…

CompletableFuture线程编排工具类

如果任务的执行方式逻辑比较复杂&#xff0c;开发成本来说比较高。CompletableFuture就是帮你处理这些任务之间的逻辑关系&#xff0c;编排好任务的执行方式后&#xff0c;任务会按照规划好的方式一步一步执行&#xff0c;不需要让业务线程去频繁的等待。 runAsync() 和 suppl…

GA入门

文章目录 GA入门GA入门培训how to setup GAezbuy GA sample GA入门 GA入门培训 https://support.google.com/analytics/answer/3424288?hlzh-Hans&ref_topic3424286 参考文档&#xff1a;https://blog.csdn.net/cathycheny/article/details/109630858 how to setup GA…

遗传算法、遗传算法库函数ga和gamultiobj、遗传算法工具箱GOT实例介绍

目录 前言 适应度函数和目标函数的关系 1. 常规遗传算法 2.结合非线性规划fmincon函数的遗传算法 2.1 fmincon非线性规划函数使用 2.2 结合非线性规划fmincon函数的遗传算法使用及示例 2.2.1 编码 2.2.2 选择 2.2.3交叉 2.2.4变异 2.2.5非线性规划fmincon函数 2.2.…
最新文章