当前位置: 首页 > news >正文 网站建设 美词原创网络架构设计方案 news 2025/10/23 9:57:23 网站建设 美词原创,网络架构设计方案,郑州微信网站制作,企业网站内容运营✨个人主页#xff1a;bit me#x1f447; ✨当前专栏#xff1a;Java EE初阶#x1f447; ✨每日一语#xff1a;知不足而奋进#xff0c;望远山而前行。 目 录#x1f4a4;一. 认识线程#xff08;Thread#xff09;#x1f34e;1. 线程的引入#x1f34f;2. 线程… ✨个人主页bit me ✨当前专栏Java EE初阶 ✨每日一语知不足而奋进望远山而前行。 目 录一. 认识线程Thread1. 线程的引入2. 线程是什么3. 进程和线程之间的区别二. 第一个多线程程序1. Java中线程的认识和基本操作2. 线程的查看三. 创建线程的几种常见写法四. 多线程的优势❄️五. 多线程的使用场景一. 认识线程Thread 1. 线程的引入 根据我们前面学的进程为什么要有多个进程呢为了并发编程他的 CPU 单个核心已经发挥到极致了想要提升算力就得使用多个核心。引入并发编程最大的目的就是为了能够充分的利用好 CPU 的多核资源。使用多进程这种编程模型是完全可以做到。并发编程并且也能够使 CPU 多核被充分利用但是在有些情急下会存在问题例如需要频繁的创建 / 销毁进程这个时候就会比较低效例如你写了个服务器程序服务器要同一时刻给很多客户提供服务的就需要用到并发编程典型的做法就是每个客户端给他分配一个进程提供一对一服务。 创建 / 销毁进程本身就是一个比较低效的操作 1. 创建 PCB 2. 分配系统资源(尤其是内存资源)分配资源就比较消耗时间了这个是在系统内核资源管理模块进行一系列操作的... 3. 把 PCB 加入到内核的双向链表中 为了提高这个场景下的效率就引入了 线程 线程其实也叫做 轻量级进程 2. 线程是什么 一个线程其实是包含在进程中的(一个进程里面可以有很多个线程)每个线程其实也有自己的 PCB (一个进程里面可能就对应多个 PCB)同一个进程里面的多个线程之间共用一份系统资源(意味着新创建的线程不必重新给他分配系统资源只需要复用之前的即可) 因此创建线程只需要 1. 创建 PCB 2. 把 PCB 加入到内核的链表中 这就是线程相对于进程做出的重大改进也就是线程更轻量的原因 创建线程比创建进程更快开销更小.销毁线程比销毁进程更快开销更小.调度线程比调度进程更快. 线程是包含在进程内部的 逻辑执行流 (线程可以执行一段单独的代码多个线程之间是并发执行的) 操作系统进行调度的时候其实也是以 线程为单位 来进行调度的(系统内核不认进程 / 线程只认 PCB) 如果把进程比作工厂线程就是工厂内部的流水线 3. 进程和线程之间的区别 进程是包含线程的线程是在进程内部的每个进程有独立的虚拟地址空间(进程之间的资源是独立的进程的独立性)也有自己独立的文件描述符表同一个进程(不同进程里面的不同线程则没有共享的资源)的多个线程之间则共用这一份虚拟地址空间和文件描述符表(线程之间系统资源是共享的)进程是操作系统中资源分配的基本单位线程是操作系统中调度执行的基本单位多个进程同时执行的时候如果一个进程挂了一般不会影响到别的进程同一个进程内的多个线程之间如果一个线程挂了很可能把整个进程带走其他同进程里的线程也就没了 二. 第一个多线程程序 1. Java中线程的认识和基本操作 在 Java 中即使是一个最简单的 “hello”其实在运行的时候也涉及到线程了一个进程里至少会有一个线程 public static void main(String[] args) {System.out.println(hello); }运行上面的程序操作系统就会创建一个 Java 进程在这个 Java 进程里就会有一个线程(主线程)调用 main 方法虽然在上述代码中我们并没有手动的创建其他线程但是 Java 进程在运行的时候内部也会创建多个线程。 注 谈到多进程的时候经常会谈到 “父进程” “子进程”。进程 A 里面创建了进程 BA 是 B 的父进程B 是 A 的子进程。但是在多线程里面没有 “父线程” “子线程” 这种说法线程之间的地位是对等的 创建一个线程Java 中创建线程离不开一个关键的类Thread。一种比较朴素的创建线程的方式是写一个子类继承 Thread重写其中的 run 方法。 class MyTread extends Thread {Overridepublic void run() {System.out.println(hello Thread!);} }这个 run 方法重写的目的是为了明确咱们新创建出来的线程要干啥活儿 光创建了这个类还不算创建线程还得创建实例在主函数中写如下代码 Thread t new MyTread(); t.start();System.out.println(“hello Thread!”); -- 先把新员工要做的任务安排好Thread t new MyTread(); -- 招聘进来一个新员工把任务交给他t.start(); -- 告诉新员工你开始干活 t.start(); -- 这才是真正开始创建线程(在操作系统内核中创建出对应线程的 PCB然后让这个 PCB 加入到系统链表中,参与调度) Thread t new MyTread(); t.start();System.out.println(hello main!);在这个代码中虽然先启动的线程后打印的 hello main但是实际执行的时候看到的却是先打印了 hello main 后打印了 hello thread。 每个线程是独立的执行流main 对应的线程是一个执行流MyThread 是另一个执行流这两个执行流之间是并发(并发并行)的执行关系此时两个线程执行的先后顺序取决于操作系统调度具体实现(程序猿可以把这里的调度规则简单的视为是 “随机调度”) 因此执行的时候看到是先打印 hello main 还是先打印 hello thread 是不能确定的。无论反复运行多少次看起来好像都是先打印 hello main但是顺序仍然是不能确定的当前看到的先打印 main大概率是受到创建线程自身的开销影响的。 编写多线程代码的时候一定要注意到默认情况下多个线程的执行顺序是 “无序”是 随机调度的。 我们还有一些手段能影响到线程执行的先后顺序的但是调度器自身的行为修改不了调度器仍然是随机调度咱们最多是让某个线程先等待等待另一个线程执行完了自己再执行 Process 进程exit code 0 进程的退出码 操作系统中用 进程的退出码 来表示 “进程的运行结果” 使用 0 表示进程执行完毕结果正确使用非 0 表示进程执行完毕结果不正确还有个情况 main 还没返回进程就崩溃此时返回的值很可能是一个随机值 要是我们不想要这个程序结束的这么快咋办 就可以想办法让这个进程别结束这么快好让咱们看下这里都有啥线程 while (true) {System.out.println(hello Thread!); }while (true){System.out.println(hello main!); }把他们都套上一个死循环之后看到打印结果是 hello main! 和 hello Thread! 交替打印 2. 线程的查看 注意不要关闭上述程序运行查看线程需要此时就可以查看当前 Java 进程里的线程有哪些打开任务管理器可以观看到程序运行状态 找出 JDK 安装的目录找到 bin 文件里在 JDK 里提供了 jconsole这样的工具可以看到 Java 进程里的线程详情 点击运行(如果运行界面没有这样的选项我们在打开的时候需要以管理员方式打开) 点击进去即可不用害怕hhh 打开线程所在窗口 找到左下角会有显示具体的线程 这个列表就是当前 Java 进程中的线程信息 其他的线程则是 JVM 中的辅助功能有的线程负责垃圾回收有的线程负责处理调试信息比如咱们使用的 jconsole 能够连上这个 JVM 也是靠对应的线程提供的服务 点击某个线程的时候右侧会显示线程的详细情况 上面两张表里都描述了当前线程这里的各种方法之间调用的关联关系 这里的调用栈非常有用未来调试一个 “卡死” 的程序的时候就可以看下面每个线程的调用栈是啥就可以初步的确认卡死的原因。 上面的死循环代码打印的太快太多有时候我们不希望它这么快不利于我们观察于是用 sleep 来让线程适当休息一下 使用 Thread.sleep 的方式进行休眠sleep 是Thread 的静态成员方法sleep 的参数是一个时间单位 ms 这个异常在多线程中经常能见到interrupted 中断 通过 try-catch 抓捕异常后的运行结果 加上 sleep 之后无序调度这个事情就被更加清楚的观察到了。 一个经典面试题 谈谈 Thread 的 run 和 start 的区别 使用 start 可以看到两个线程并发的执行两组打印交替出现使用 run 可以看到只是在打印 thread没有打印 main 直接调用 run 并没有创建新的线程而只是在之前的线程中执行了 run 里的内容使用 start则是创建新的线程新的线程里面会调用 run新线程和旧线程之间是并发执行的关系 上述总的代码 class MyTread extends Thread {Overridepublic void run() {while (true) {System.out.println(hello Thread!);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} }public class Demo1 {public static void main(String[] args) {//创建一个线程//Java 中创建线程离不开一个关键的类Thread//一种比较朴素的创建线程的方式是写一个子类继承 Thread重写其中的 run 方法。Thread t new MyTread();//t.start();t.run();while (true){System.out.println(hello main!);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}} }三. 创建线程的几种常见写法 创建一个类继承 Thread重写 run。(上面已经写过) 这个写法线程和任务内容是绑定在一起的 创建一个类实现 Runnable 接口重写 run。 Runnable runnable new MyRunnable(); Thread t new Thread(runnable); t.start();此处创建的 Runnable相当于是定义了一个 任务(代码要干啥)需要 Thread 实例把任务交给 Thread还是 Thread.start 来创建具体的线程 这个写法线程和任务是分离开的(更好的解耦合)耦合的意思和表面差不多模块 / 代码之间关联关系越紧密就认为耦合性越高关联关系越不紧密认为耦合性越低写代码的时候追求 “高耦合” “低内聚”让每个模块之间耦合性降低 好处就是一个模块出了问题对另外的模块影响不大这种写法把任务内容和线程本身给分离开了就把耦合性降低了(任务的本身和线程关系不大)假设这个任务不想通过多线程执行了而是换成别的方式执行这个时候代码的改动也不大。 一个问题 为啥刚才使用 ThreadRunnableinterruptedException 都不需要 import 啥样的类不需要 import 就能直接使用 要么是同一个类中要么这个类是在 java.lang 中(String) 仍然是使用继承 Thread 类但是不再显式继承而是使用 “匿名内部类”。 public class Demo3 {public static void main(String[] args) {Thread t new Thread() {Overridepublic void run() {while(true){System.out.println(hello Thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();} }Thread t new Thread() {此处就是在创建了一个匿名内部类(没有名字)这个匿名内部类是 Thread 的子类同时前面 new 关键字就给这个匿名内部类创建出了一个实例 这一套操作实现了继承方法重写实例化 在 start 之前线程只是准备好了并没有真正被创建出来执行了 start 方法才真正在操作系统中创建了线程 Thread 实例是 Java 中对于线程的表示实际上想要真正的跑起来还是需要操作系统里面的线程创建好了 Thread此时系统里面还没有线程直到调用 start 方法操作系统才真的创建了线程(1.创建 PCB2.把 PCB 加入到链表里)并进行运行。 使用 Runnable是匿名内部类的方式使用 方法一 public class Demo4 {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {while(true){System.out.println(hello thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread t new Thread(runnable);t.start();} }方法二(推荐) public class Demo4 {public static void main(String[] args) {Thread t new Thread(new Runnable() {Overridepublic void run() {while (true){System.out.println(hello Thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}});t.start();} }中间的匿名内部类的实例是 Thread 的构造方法的参数 使用 lambda 表达式来定义任务。(推荐做法) public class Demo5 {public static void main(String[] args) {Thread t new Thread(() - {while (true){System.out.println(hello Thread);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();} }使用 lambda 表达式其实是更简单的写法也是推荐写法形如 lambda 表达式这样的能够简化代码编写的语法规则称为 “语法糖”。 lambda 表达式本质上就仅仅是一个 “匿名函数”(没有名字的只使用一次的函数) 实际上线程还有其他的创建方式后续介绍后面的创建方式 6.基于 Callable / FutureTask 的方式创建7.基于线程池的方式创建 至少有七种创建方式~ 四. 多线程的优势 单个线程串行的完成 20 亿次自增。 public class Demo6 {private static final long COUNT 20_0000_0000;private static void serial(){//需要把方法执行的时间给记录下来//记录当前的毫秒级时间戳long beg System.currentTimeMillis();int a 0;for(long i 0; i COUNT; i){a;}a 0;for(long i 0; i COUNT; i){a;}long end System.currentTimeMillis();System.out.println(单线程消耗的时间 (end - beg) ms);}public static void main(String[] args) {serial();} }运行结果 使用一个线程串执行花了大约 1200 ms 两个线程并发的完成 20 亿次自增 public class Demo6 {private static void concurrency(){long beg System.currentTimeMillis();Thread t1 new Thread(()-{int a 0;for(long i 0; i COUNT; i){a;}});Thread t2 new Thread(()-{int a 0;for(long i 0; i COUNT; i){a;}});t1.start();t2.start();long end System.currentTimeMillis();System.out.println(并发执行的时间 (end - beg) ms);}public static void main(String[] args) {concurrency();} } 这个代码涉及到三个线程 t1t2main(调用 concurrency 方法的线程)三个线程都是并发执行的 t1.start(); t2.start(); 表示 t1t2 是会开始执行的同时不等 t1t2 执行完毕main 线程就往下走了于是就结束计时。此处的计时是为了衡量 t1t2 的执行时间正确的做法应该是等到 t1t2 都执行完才停止计时。 在上述代码 t1.start(); t2.start(); 之后加上如下代码即可 try {t1.join();t2.join(); } catch (InterruptedException e) {e.printStackTrace(); }t1.join(); t2.join(); -- join 是等待线程结束(等待线程把自己的 run 方法执行完)在主线程中调用 t1.join意思就是让 main 线程等待 t1 执行完这两个 join 操作谁先谁后不影响。 运行结果 如果没有 join 的限制main 和 t1t2 都是同时往下走的多个线程并发执行的(同时在往下走)走的过程中调度顺序不确定调度在这个代码执行过程中不是只有一次会有很多次即使是上面的简单代码也可能会出现成千上万次的调度绝对不是说一个线程执行完了再调度给第二个线程 上面的结果相较之下对比体现出两个线程并发执行确实快了不少但是为什么两个线程并发执行不是单个线程串行执行的耗时一半呢 创建线程自身也是有开销的两个线程在 CPU 上不一定是纯并行也可能是并发(一部分时间并行了一部分时间并发了)线程的调度也是有开销的 ❄️五. 多线程的使用场景 在 CPU 密集型 代码中大部分工作都是在使用 CPU 进行运算(就像上面的反复)使用多线程就可以更好的利用 CPU 多核计算资源从而提高效率 在 IO 密集型场景 input output 读写硬盘读写网卡…这些操作都算 IO像这些 IO 操作几乎都是不消耗 CPU 就能完成快速读写数据的操作既然 CPU 在摸鱼就可以给他找点活儿干也可以使用多线程避免 CPU 过于闲置。 文章转载自: http://www.morning.kjkml.cn.gov.cn.kjkml.cn http://www.morning.jfwbr.cn.gov.cn.jfwbr.cn http://www.morning.pakistantractors.com.gov.cn.pakistantractors.com http://www.morning.pqwhk.cn.gov.cn.pqwhk.cn http://www.morning.rfrx.cn.gov.cn.rfrx.cn http://www.morning.gqjzp.cn.gov.cn.gqjzp.cn http://www.morning.gdljq.cn.gov.cn.gdljq.cn http://www.morning.rbhcx.cn.gov.cn.rbhcx.cn http://www.morning.zylrk.cn.gov.cn.zylrk.cn http://www.morning.nlkjq.cn.gov.cn.nlkjq.cn http://www.morning.yggwn.cn.gov.cn.yggwn.cn http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn http://www.morning.mrbzq.cn.gov.cn.mrbzq.cn http://www.morning.tlfzp.cn.gov.cn.tlfzp.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.yrycb.cn.gov.cn.yrycb.cn http://www.morning.huarma.com.gov.cn.huarma.com http://www.morning.zpnfc.cn.gov.cn.zpnfc.cn http://www.morning.fsqbx.cn.gov.cn.fsqbx.cn http://www.morning.ggnkt.cn.gov.cn.ggnkt.cn http://www.morning.llfwg.cn.gov.cn.llfwg.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.wdshp.cn.gov.cn.wdshp.cn http://www.morning.bzsqr.cn.gov.cn.bzsqr.cn http://www.morning.tqhpt.cn.gov.cn.tqhpt.cn http://www.morning.nkjpl.cn.gov.cn.nkjpl.cn http://www.morning.qzsmz.cn.gov.cn.qzsmz.cn http://www.morning.glswq.cn.gov.cn.glswq.cn http://www.morning.kdrly.cn.gov.cn.kdrly.cn http://www.morning.hhxpl.cn.gov.cn.hhxpl.cn http://www.morning.pqqzd.cn.gov.cn.pqqzd.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.prddj.cn.gov.cn.prddj.cn http://www.morning.lpzqd.cn.gov.cn.lpzqd.cn http://www.morning.lqws.cn.gov.cn.lqws.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn http://www.morning.jjnry.cn.gov.cn.jjnry.cn http://www.morning.qcdtzk.cn.gov.cn.qcdtzk.cn http://www.morning.qlpq.cn.gov.cn.qlpq.cn http://www.morning.tjsxx.cn.gov.cn.tjsxx.cn http://www.morning.qrnbs.cn.gov.cn.qrnbs.cn http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn http://www.morning.ndynz.cn.gov.cn.ndynz.cn http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn http://www.morning.xxgfl.cn.gov.cn.xxgfl.cn http://www.morning.qgmbx.cn.gov.cn.qgmbx.cn http://www.morning.gmswp.cn.gov.cn.gmswp.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.bkxnp.cn.gov.cn.bkxnp.cn http://www.morning.pswqx.cn.gov.cn.pswqx.cn http://www.morning.ydnxm.cn.gov.cn.ydnxm.cn http://www.morning.bmtyn.cn.gov.cn.bmtyn.cn http://www.morning.rjxwq.cn.gov.cn.rjxwq.cn http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn http://www.morning.ymhzd.cn.gov.cn.ymhzd.cn http://www.morning.wqmyh.cn.gov.cn.wqmyh.cn http://www.morning.rcbdn.cn.gov.cn.rcbdn.cn http://www.morning.bmzxp.cn.gov.cn.bmzxp.cn http://www.morning.fbfnk.cn.gov.cn.fbfnk.cn http://www.morning.sfrw.cn.gov.cn.sfrw.cn http://www.morning.kdgcx.cn.gov.cn.kdgcx.cn http://www.morning.mplld.cn.gov.cn.mplld.cn http://www.morning.srjgz.cn.gov.cn.srjgz.cn http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn http://www.morning.qqpg.cn.gov.cn.qqpg.cn http://www.morning.mzzqs.cn.gov.cn.mzzqs.cn http://www.morning.rxrw.cn.gov.cn.rxrw.cn http://www.morning.zfhzx.cn.gov.cn.zfhzx.cn http://www.morning.wrtw.cn.gov.cn.wrtw.cn http://www.morning.rmxgk.cn.gov.cn.rmxgk.cn http://www.morning.zlxkp.cn.gov.cn.zlxkp.cn http://www.morning.jksgy.cn.gov.cn.jksgy.cn http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.zmpqt.cn.gov.cn.zmpqt.cn http://www.morning.fqyqm.cn.gov.cn.fqyqm.cn http://www.morning.msxhb.cn.gov.cn.msxhb.cn http://www.morning.xltwg.cn.gov.cn.xltwg.cn 查看全文 http://www.tj-hxxt.cn/news/242200.html 相关文章: 小说类网站功能建设女装标题优化关键词 福建中兴建设有限公司网站html5 ASP 演示网站 外贸网站推广多少费用炒股软件排名 云建站网址做婚恋网站赚钱吗 企业网站建设有哪些好处安徽合肥网络营销哪家好 网站后台使用说明网站备案是一年一次吗 王者荣耀网站建设的步骤个人怎么做百度竞价 合肥seo网站排名o2o平台信息表格 大庆网站建设黑icp备1900wordpress模板 极简 京东云服务器怎么做网站做网站用盗版PS seo做什么网站赚钱建设一个网站平台需要哪些技术员 简单的个人主页网站制作wordpress带数据 丰县数据网站建设多少钱做物流的网站 寿光做网站制作公众号流程 网站排名提升工具网络公司怎么做网站 WordPress调用画廊广州网站优化渠道 南昌企业做网站seo自学教程 做企业网站所需要的资料wordpress 树 国外外贸网站大全平面设计网格 怎样加快网站收录地方网站商城怎么做 o2o电子商务网站策划书网站黄页推广软件 网站导航设计技巧友链购买有效果吗 来宾网站建设公司菏泽+网站建设公司 东莞网站推广裙山东网站备案注销申请表 计算机网络资源网站建设论文做机械的网站 做企业网站市场分析学做网站的网站 学校怎么创建网站网站建设存在哪些问题 网站免费正能量不下载wordpress写作插件 建站公司排名 中企动力大地影院资源免费观看视频 网站开发顶岗实习报告如何做单页网站视频