多线程的五种“打开”方式

1 概念

1.1 线程是什么??

线程(Thread)是计算机科学中的一个基本概念,它是进程(Process)中的一个执行单元,负责执行程序的指令序列。线程是操作系统能够进行调度和执行的最小单位。在多任务操作系统中,多个线程可以在同一个进程内并发执行,共享进程的资源。

{

假设你正在厨房中准备晚餐,这个过程中有多个线程在运行,每个线程代表一个不同的烹饪任务。这些线程可以同时执行,以加速整个烹饪过程,就像多线程在计算机程序中一样。

  1. 主厨线程:这个线程负责协调整个烹饪过程。主厨线程制定了食谱和指导其他线程如何协同工作。

  2. 切菜线程:这个线程负责将食材切成适当的大小和形状。它可以在切菜板上进行多个切割任务,以提高效率。

  3. 炉灶线程:这个线程负责在炉灶上烹饪不同的菜肴。例如,一个线程可以煮汤,另一个线程可以煎肉,它们可以同时工作,以节省时间。

  4. 烤箱线程:如果你需要烤一道菜,那么烤箱线程可以负责在烤箱中烘烤食物,同时其他线程继续处理其他任务。

  5. 洗碗线程:一旦完成烹饪,就有一个线程负责洗碗和清理厨房。这个线程可以与其他线程并发运行,以确保整个晚餐流程的顺利结束。

在这个例子中,每个线程都代表一个不同的烹饪任务,它们可以并行工作,以提高烹饪效率,就像多线程在计算机程序中允许不同任务并发执行一样

}

1.2  为什么要使用线程??

1 “并发编程”成为“刚需”

        单核CPU的发展遇到了瓶颈,想要提高算力,就需要多核CPU。而并发编程能够充分利用多核CPU资源;

        有些任务场景需要“等待IO”,为了让等待的时间去做一些其他工作,也需要使用到并发编程。

2. 虽然进程也能够实现并发编程,但是线程比进程更加轻量级。

  • 创建线程比创建进程更快.
  • 销毁线程比销毁进程更快.
  • 调度线程比调度进程更快.

1.3 进程和线程的区别??

  • 进程是包含线程的。每个进程至少有一个线程的存在,也就是主线程;
  • 进程和线程之间不共享内存空间。同一个进程的线程之间共享同一内存空间;
  • 进程是系统分配资源的最小单位,线程是操作系统调度的最小单位;
  • 进程是相互独立的,一个进程的崩溃通常不会影响其他进程。线程之间更密切相关,一个线程的错误可能会影响到同一进程中的其他线程。
  • 创建和销毁进程通常比线程昂贵,因为进程需要分配和释放独立的内存空间和资源。线程的创建和销毁通常更快,因为它们共享进程的资源,不需要分配独立的内存空间。

1.4 Java的线程和操作系统的线程的区别??

  • 线程是操作系统中的概念. 操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用(例如 Linux pthread ).
  • Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进行了进一步的抽象和封装.

2 感受多线程代码

多线程和普通程序最大的区别就是每个线程都是独立的执行流 多线程之间是并发执行的。

public class ThreadDemo {private static class MyThread extends Thread{@Overridepublic void run() {Random random = new Random();while (true){// 打印主线程名称System.out.println(Thread.currentThread().getName());try {Thread.sleep(random.nextInt(10));//随机停止运行0-9秒} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();MyThread t3 = new MyThread();//启动并创建线程工作t1.start();t2.start();t3.start();//主线程工作Random random = new Random();while (true){// 打印主线程名称System.out.println(Thread.currentThread().getName());try {Thread.sleep(random.nextInt(10));//随机停止运行0-9秒} catch (InterruptedException e) {e.printStackTrace();}}}
}

结果:

我们可以使用JDK提供的jconsole命令观察线程(在jdk的bin目录下面)

3 创建线程的“五种”方式

方法1 继承Thread类

public class ThreadDemo1 {static class MyThread extends Thread{//重写run方法  run描述该线程要干的活是什么@Overridepublic void run() {System.out.println("我是一个线程 hello thread!");}//run方法执行完毕后 新的这个线程就会被销毁}public static void main(String[] args) {Thread thread = new MyThread();//thread类不需要任何包??为什么还有哪些我们见过的 出现这种情况 java.lang包下面的是不用导包的 比如string stirngbuilderthread.start();//线程中的启动方法 start创建了一个新线程 有新线程来执行run方法}
}

方法2 实现Runnable 接口

// Runnable 作用就是描述一个“要执行的任务” run方法就是任务的执行细节
class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("hello thread-runnable");}
}public class ThreadDemo2 {public static void main(String[] args) {// new Runnable就是描述一个任务MyRunnable runnable = new MyRunnable();//然后将这个任务交给线程来执行Thread thread = new Thread(runnable);thread.start();thread.run();/** thread.run()是在当前线程中执行线程的任务,没有创建新的线程,不实现并发。thread.start()创建一个新的线程,并在新线程中执行线程的任务,实现了多线程并发。通常应该使用thread.start()来启动线程*/}
}

首先对比一下上面两种方法:

  • 继承 Thread , 直接使用 this 就表示当前线程对象的引用.
  • 实现 Runnable 接口, this 表示的是 MyRunnable 的引用. 需要使用 Thread.currentThread()

后面的方法都是前两者的“变形”:

方法3 匿名内部类创建 Thread 子类对象

//使用匿名内部类来实现线程
public class ThreadDemo3 {public static void main(String[] args) {Thread t = new Thread() {@Overridepublic void run() {System.out.println("匿名内部类实现thread");}};t.start();}
}

方法4 匿名内部类创建 Runnable 子类对象

//使用匿名内部类
public class ThreadDemo4 {public static void main(String[] args) {Thread t = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("实现runnable-匿名内部类");}});t.start();}
}

方法5 lambda 表达式创建 Runnable 子类对象

//lambda
public class ThreadDemo5 {public static void main(String[] args) {Thread t = new Thread(() -> {System.out.println("hello thread");});t.start();}
}

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

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

相关文章

Linux中的基础IO

目录 1、关于C语言中的文件操作符 1.1 C语言中写文件 1.2 C语言读文件 1.3 往显示器上输出信息 1.4 stdin & stdout & stderr 1.5 打开文件的方式 2、系统文件IO 2.1 写操作文件 2.2 读操作文件、 2.3 open open函数的返回值 2.4 文件描述符 0 & 1 &a…

赴日IT 如何提高去日本做程序员的几率?

其实想去日本做IT工作只要满足学历、日语、技术三个必要条件,具备这些条件应聘就好,不具备条件你就想办法具备这些条件,在不具备条件之前不要轻易到日本去,日本IT行业虽然要求技术没有国内那么高,但也不是随便好进入的…

uniapp 微信小程序添加隐私保护指引

隐私弹窗&#xff1a; <uni-popup ref"popup"><view class"popupWrap"><view class"popupTxt">在你使用【最美万年历】之前&#xff0c;请仔细阅读<text class"blueColor" click"handleOpenPrivacyContract…

Spark【RDD编程(二)RDD编程基础】

前言 接上午的那一篇&#xff0c;下午我们学习剩下的RDD编程&#xff0c;RDD操作中的剩下的转换操作和行动操作&#xff0c;最好把剩下的RDD编程都学完。 Spark【RDD编程&#xff08;一&#xff09;RDD编程基础】 RDD 转换操作 6、distinct 对 RDD 集合内部的元素进行去重…

C语言:截断+整型提升+算数转换练习

详情关于整型提升、算数转换与截断见文章&#xff1a; 《C语言&#xff1a;整型提升》 《C语言&#xff1a;算数转换》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求…

ToBeWritten之VSOC安全运营

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

华为OD:敏感字段加密

题目描述&#xff1a; 给定一个由多个命令字组成的命令字符串&#xff1a; 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号&#xff1b; 2、命令字之间以一个或多个下划线_进行分割&#xff1b; 3、可以通过两个双引号”"来标识包含下划线…

【实战】十一、看板页面及任务组页面开发(六) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

pytest笔记: pytest单元测试框架

第一步&#xff1a;安装 和查看版本 pycharm settings 查看 第二步&#xff1a; 编写test_example.py def inc(x):return x1 def test_answer():assert inc(4) 5 第三步&#xff1a;在当前路径下执行pytest 命令 PS E:\data\web测试\Selenium3自动化测试实战——基于Pyth…

应用程序管理工具

应用程序管理是 DevOps 的重要组成部分。它可以定义为在所有阶段监控和管理软件应用程序的可用性、运行状况、性能和功能的过程&#xff0c;包括规划、设计、构建、测试、部署、维护和更新。这意味着应用程序从概念到停止都受到监控。 应用程序管理的重要性 管理应用程序可确…

db2迁移至oracle

1.思路 &#xff08;1&#xff09;用java连接数据库&#xff08;2&#xff09;把DB2数据导出为通用的格式如csv&#xff0c;json等&#xff08;3&#xff09;导入其他数据库&#xff0c;比如oracle&#xff0c;mongodb。这个方法自由发挥的空间比较大。朋友说他会用springboot…

《2023年网信人才培训-网络安全从业人员能力素养提升培训》第一期成功举办

随着网络强国和数字中国建设的步伐加快&#xff0c;建设规模宏大、结构合理、素质优良的人才队伍成为一项重要工作。知了汇智作为数字产教融合基地&#xff0c;通过与高校、企业等多方合作&#xff0c;建立了完整的网络安全人才培养生态链。凭借自身技术优势和丰富的产业资源&a…

新建工程——第一个S32DS工程

之前的"测试开发板"章节 测试开发板——第一个AutoSAR程序,使用了一个 demo 工程,不管是裸机程序还是 AutoSAR 程序,那都是别人已经创建好的工程。本节来介绍如何来创建自己的工程,本节介绍如何创建一个 S32DS 的工程,点亮开发板上的 LED 我们从官方提供的例程…

为什么删除Windows 11上的Bloatware可以帮助加快你的电脑速度

如果你感觉你的电脑迟钝&#xff0c;彻底清除软件会有所帮助&#xff0c;而且这个过程对Windows用户来说越来越容易。 微软正在使删除以前难以删除的其他预装Windows应用程序成为可能。专家表示&#xff0c;这项新功能可能会改变用户的游戏规则。 科技公司Infatica的主管Vlad…

测试人:“躺平?不可能的“, 盘点测试人在职场的优势

之前有这么一个段子&#xff1a;有人喜欢创造世界&#xff0c;他们做了程序员&#xff1b;有人喜欢拯救世界&#xff0c;他们做了测试员&#xff01;近几年&#xff0c;测试工程师在企业究竟是怎么样的发展&#xff1f;随着企业对于用户体验的满意度越来越重视&#xff0c;更加…

两个线程同步执行:解决乱箭穿心(STL/Windows/Linux)

C自学精简教程 目录(必读) C并发编程入门 目录 多线程同步 线程之间同步是指线程等待其他线程执行完某个动作之后再执行&#xff08;本文情况&#xff09;。 线程同步还可以是像十字路口的红绿灯一样&#xff0c;只允许一个方向的车同行&#xff0c;其他方向的车等待。 本…

C#,《小白学程序》第八课:列表(List)应用之二“编制高铁列车时刻表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary&g…

JavaScript设计模式(四)——策略模式、代理模式、观察者模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Python3 条件控制

Python3 条件控制 Python 条件语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: 代码执行过程&#xff1a; if 语句 Python中if语句的一般形式如下所示&#xff1a; if conditi…

Spring Cloud Foundry上使用通配符模式匹配进行的安全绕过漏洞 CVE-2023-20873

文章目录 0.前言1.参考文档2.基础介绍描述如果满足以下任一条件&#xff0c;应用程序就不会有太大风险&#xff1a;受影响的Spring产品和版本 3.解决方案3.1. 升级版本3.2. 替代方案 0.前言 背景&#xff1a;公司项目扫描到 Spring Cloud Foundry上使用通配符模式匹配进行的安全…