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

news/2025/2/18 12:16:21/

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

  • 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…