范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

详细讲解多线程初阶认识线程

  认识线程一、概念什么是线程
  一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行着多份代码.
  为什么要有进程?
  因为我们的系统支持多任务,这个就需要程序员来"并发编程"。(这里的并发编程是 并行 + 并发)。  为什么要有线程
  多进程出现的问题
  通过多进程,是完全可以实现并发编程的,但是有一点问题。
  如果我们频繁的创建/销毁进程,这个事情的成本是比较高的。如果我们需要频繁的调度进程,这个事情成本也是比较高的。
  创建进程就得分配资源:内存资源和文件资源。
  销毁进程就得释放资源:内存资源和文件资源。
  对于资源申请和释放,本身就是一个比较低效的操作。
  如何解决这个问题
  思路有两个:  进程池(比如数据库连接池,字符串常量池)。
  进程池虽然能解决上述频繁创建和销毁的问题,但是进程池太消耗系统的资源了,因为在进程池里面有很多闲置的进程。  使用线程来实现并发编程。
  线程比进程更轻量,每一个进程可以执行一个任务,每一个线程也能执行一个任务,他们都能实现并发编程。
  创建线程的成本比创建进程要低很多。
  销毁线程的成本比创建进程要低很多。
  调度线程的成本比创建进程要低很多。
  在Linux系统中,把 线程 称为 轻量级进程 (LWP)。
  为什么线程比进程更轻量
  进程的重量是重在资源的申请和释放上面。
  线程是包含在进程中的,一个进程可以有多个线程,这多个线程公用同一份资源(同一份内存 + 文件),只是在创建进程的第一个线程的时候需要分配资源,之后进入这个进程的线程不需要再申请资源,这个时候创建线程的成本就会变低。
  这个就会有一个疑问,多加一些线程,是不是效率就会进一步提升呢?
  一般来说是会的,但是也不一定。
  如果线程多了,这些线程就会要竞争同一个资源,这个时候,整体的速度就会收到限制(整体的硬件资源是有效的)。
  线程和进程的区别和联系  进程包含线程。一个进程可以有一个或者多个线程,多个线程公用同一份资源。  进程和线程都是为了处理并发编程这样的场景。  但是创建进程和销毁进程的效率低,而线程就比较的轻量,线程少了创建进程和销毁进程这个过程。  操作系统创建进程,要给进程分配资源,进程是操作系统分配资源的最小单位。  操作系统创建线程,是在CPU中执行调度,线程是CPU执行调度的基本单位。  进程具有独立性,每一个进程都有各自独立的地址空间。一个进程挂了,不会影响其他的进程。  但是在同一个进程中的多个线程,公用同一个内存空间。一个线程挂了,可能影响到其他的线程,甚至导致整个进程崩溃。  二、创建线程
  Java中进行多线程编程,在Java标准库中,就提供了一个Thread类,用来操作线程。Thread类也可以视为是Java标准库提供的API。
  创建好的Thread实例,其实和操作系统中的线程一一对应的关系。
  操作系统提供了一组关于线程的API(C语言实现的),Java对这一组API进一步封装,就成为了Thread类。  方法一 继承 Thread 类
  创建子类,继承Thread类,并重写run方法。  class MyThread extends Thread{     //创建一个MyThread子类继承Thread类。     @Override   //其中run方法中的内容描述了线程内部要执行的代码     public void run() {     //要注意的是,并不是写出这个代码,线程就创建出来了。这个是把要执行的代码准备好。         System.out.println("hello thread!");     } }  public class TestDome1 {       public static void main(String[] args) {           Thread thread1 = new MyThread();   //创建MyThread子类的对象。         thread1.start();   //当调用这里的start方法,才是真正的在系统中创建了线程。                            //在这里才是真正的执行上面我们写的run方法中的代码。在调用start之前,系统没有创建出线程的。     } }方法二 实现 Runnable 接口
  通过Runnable来描述任务的内容,进一步的再把描述好的任务交给Thread实例  class MyRunnable implements Runnable{     //继承接口     @Override     public void run() {     //实现接口中的方法         System.out.println("Hello Runnable");     } }  public class TestDome2 {       public static void main(String[] args) {           // 创建 Thread 类实例, 调用 Thread 的构造方法时将 Runnable 对象作为 target 参数。         Thread thread1 = new Thread(new MyRunnable());           thread1.start();   //创建线程,执行代吗     } }方法三 匿名内部类创建 Thread 子类对象public class TestDome3 {       public static void main(String[] args) {           Thread thread = new Thread(){     //创建出这个匿名内部类的实例             @Override   //创建了一个匿名内部类,继承自Thread类,重写了run方法,             public void run() {                   System.out.println("Hello Thread!!");             }         };         thread.start();   //开始执行线程     } }方法四 匿名内部类创建 Runnable 子类对象public class TestDome4 {       public static void main(String[] args) {           //new Runnable,是针对这个创建的内部类,同时Runnable实例传给Thread的构造方法         Thread thread =  new Thread(new Runnable() {               @Override             public void run() {     //要执行的代码                 System.out.println("hello thread");             }         });         thread.start();   //创建线程,执行代码。     } }
  通常认为 匿名内部类创建 Runnable 子类对象 这中方法更好一点,能够做到让线程和线程执行的任务更好的解耦。(写代码一般希望,高内聚,低耦合)
  Runnable单纯的只是描述了一个任务,至于这个任务是要通过一个进程来执行,还是线程来执行,还是协程来执行,Runnable本身不关心。  方法五 使用lambda 表达式public class TestDome6 {       public static void main(String[] args) {           Thread thread1 = new Thread(()->{     //使用lambda表达式来代替了Runnable。             System.out.println("hello thread1");         });         thread1.start();     } }
  上面的五种写法都很常见,希望大家都能够熟悉  三、线程之间并发执行public class TestDome5 {       public static void main(String[] args) {           Thread thread1 = new Thread(new Runnable() {     //使用匿名内部类创建 Runnable 子类对象             @Override             public void run() {                   while(true){     //如果一个循环中不加任何限制,这个循环转的速度是非常快的,我们一般看不过来                    //我们就可以再循环中加一个sleep操作,来强制让这个线程休眠一段时间。                     System.out.println("hello thread");                     try {     //这个是让线程强行进入堵塞状态,单位是ms                         Thread.sleep(1000);   //1000ms表示1s中之内这个线程不会到CPU中执行。                     } catch (InterruptedException e) {                           e.printStackTrace();   //抛出异常,线程被强制中断的异常。                     }                 }             }         });         thread1.start();          //在进程中至少有一个线程,在一个Java进程中,会有一个调用main方法的线程         //这个线程不是人为调动的,是系统自带的。         while(true){               System.out.println("hello main");             try {                   Thread.sleep(1000);   //休眠一秒,线程堵塞一秒             } catch (InterruptedException e) {                   e.printStackTrace();             }         }     } }
  上面这个程序是:自己创建T线程和自动创建的main线程并发执行(在宏观上看起来同时执行)。
  两个线程,都是打印一条就休眠1s,由代码运行结果图可知,当1s时间到了之后,系统先唤醒谁是不确定的(随机的)。
  对于操作系统来说,内部对于线程之间的调度顺序,在宏观上可以认为是随机的(线程之间是抢占式执行),这个随机性会给多线程编程带来很多的麻烦。  四、多线程的优势-增加运行速度
  可以观察多线程在一些场合下是可以提高程序的整体运行效率的。  public class TestDome7 {   	//在写一个比较长的整数常量的时候就可以通过_来进行分隔     private static final long COUNT = 10_0000_0000;   //定义一个常量COUNT=10_0000_0000      public static void main(String[] args) throws InterruptedException {       	//使用串行         serial();         //使用并行         concurrency();     } 	//实现两个数自增10亿次     private static void serial() {       	//System.currentTimeMillis()  Java自带的记录当前系统的时间戳。         long begin = System.currentTimeMillis();         long a = 0;         for(long i=0; i{     //第一个线程             long a = 0;             for(long i=0; i{     //第二个线程             long b = 0;             for(long i=0; i
很多苹果用户都懵了!什么情况?昨天,话题词苹果设备不断要求输入AppleID密码冲上了热搜第一。据多位用户反映,他们的苹果设备不断要求输入AppleID密码,即使输入了正确的密码,系统也会提示登录失败。一些用户中芯梁孟松公布7nm后,国产芯就出现了一个奇怪的现象文文评科技有消息指出,对于中国半导体产业,美国又要加码实施最新一轮打压了,据悉,在美国正在酝酿的最新一轮芯片限制中,将重点限制高通英特尔等向华为出货4GWiFi等系列产品,一但美方梭哈大模型,阿里云成了跟风者?伴随AI大模型潘多拉魔盒打开,云市场GameChanger已到来。对阿里云这个昔日老大哥而言,从领先者变为跟风者,是否还有机会去重塑行业规则?作者杨铭编辑刘珊珊这可能是张勇全面掌舵对屏幕有追求是用不了iPhone机的,最优解应该是小米13Ultra屏幕的重要性,不言而喻。没人愿意用一款瞎眼屏,甚至有的机型用半小时之后,用户的眼睛就酸痛的不行,像iPhone机这些年在屏幕上的表现,我其实是不怎么喜欢的,每次用它来看电子小说,不索赔205万后,周杰伦还会回归网易云吗?周杰伦起诉网易(NTES。US)的余热还未完全散去,4月17日上午,这起不正当竞争案于杭州市滨江区人民法院开庭审理。银柿财经第一时间从知情人士处获悉,相关负责人出席了今天的庭审。同五一前最值得买的5款手机,性能强悍价格不贵,最低仅售千元起如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。每日分享五一前最值得买的5款手机,性能强悍价格不贵,最低仅售千元起。第一款一加Ace竞速版参考价格1749元(1打算换小米和oppo手机,这四款已跌到真香价格,最低才1395元如果您喜欢,可以点击上面的关注二字。后续会为您提供更多有价值的内容。今天分享打算换小米和oppo手机,这四款已跌到真香价格,最低才1395元第一款真我10Pro参考价格1389元(GPT全家桶,喂不饱商汤科技加码追风大模型,终究没能让商汤科技找回投资者们的信心。4月10日,商汤发布了日日新SenseNova大模型体系,且一口气展示了多个产品,有类ChatGPT产品商量(SenseCha千万小心!支付宝新推出这一功能,无需确认便可以转走你的钱北京商报讯(记者刘四红)你知道小荷包吗?这是由支付宝推出的功能,用户可以把钱放进不同的小荷包,专款专用分类管理。每个小荷包的存入和支出都有独立账单,享有和余额宝相同的收益,还可对支分享50常用工具函数之xijs更新指南(v1。2。3)xijs是一款开箱即用的js业务工具库,聚集于解决业务中遇到的常用的js函数问题,帮助开发者更高效的进行业务开发。目前已聚合了50常用工具函数,接下来就和大家一起分享一下v1。2。美芯片法案让芯片大厂无法接受,三星台积电SK海力士落入尴尬境地自从漂亮国千方百计地打压中国科技企业和拥有自研芯片以及5G技术的华为公司之后,人们对于半导体芯片的关注度不断攀升,原来小小的一枚芯片竟然有如此大的能量可以决定一家公司的生死存亡。但
900亿钴茅大消息!韩国锂电巨头下巨额订单中国基金报记者文夕钴茅牵手韩国新能源巨头。1月4日,华友钴业(603799)宣布向韩国锂电巨头浦项化学以及双方的合资公司供应三元前驱体,三年供应量达到17。5万吨。此次华友钴业并未陕汽产线项目荣获省级智能工厂认定总分第一名近日,陕汽新基地车架纵梁产线项目以总分第一的成绩成功入选由陕西省工业和信息化厅陕西省财政厅联合组织开展的2022年度省级智能工厂认定名单。陕汽新基地车架纵梁产线项目独创商用车行业车血氧仪热销!相关品类成交额暴增6100!生产企业开足马力,经销商加大备货力度(央视财经正点财经)血氧仪是一种可以时刻检测血氧水平的医疗器械。血氧饱和度小于等于93,是诊断重型新冠患者的参考依据之一。近期,血氧仪的销量大增,部分产品已经出现了缺货的情况。上海今日小寒,你不知道的养生秘诀!万言国学,与你一起,品读万卷经典,博古言今,做更好的自己今日小寒,你那里冷吗?民间有一句俗话小寒大寒,冷成冰团。小寒是2023年的第一个二十四节气,预示了一年中最寒冷的日子即将到来为什么女人要穿安全裤?(漫画讲述)看完也许就明白了前言每当到了炎热的季节,很多女孩都会选择美美的连衣裙出门,穿上美美的衣服走在大街上,回头率是很高的,但是很多女孩直言不敢穿连衣裙,因为害怕走光,所以有些商家为了顺应女孩们的心理,慢2023开运色搭配就要直白的美好最早的电影是黑白的,直到彩色电影的出现,电影才开始真正蓬勃发展,因为色彩赋予了画面里的人物以生命,颜色对我们而言,除了可以影响感官,也会影响我们的情绪与磁场。新年,让我们怀着对美好胸大腿粗的女人,尽量别穿羽绒服长裤!这样穿才洋气显瘦引以为傲的身材,可以成为穿搭的加分点。但如果身材有弊端,在很多人眼中,仿佛是时尚的绝缘点,不仅会让穿搭又显胖,又没气质,还会让自己被潮流甩在身后。正确的对待自己的身材特点,借助合适Dior为GranTurismo7打造的独家赛车头盔精彩何在自Dior于8月携手人气赛车遊戏大作GranTurismo7后,近日Dior完成了虚拟联名造型中的赛车头盔之实体化,品牌男状首席鞋履设计师ThiboDenis予以完整公开。头盔采用同为亚洲美后87岁莫尼列优雅老去,91岁诗丽吉沉迷整容一脸横肉1979年,43岁的莫尼列太后陪同丈夫西哈努克亲王,前往中国访问。此时的莫尼列风韵犹存,穿着宝蓝色的职场风套装,站在阳光下微笑凝望镜头,美得一丝不苟。莫尼列烫染了上世纪最时髦的短款谁是卧底中的平描技法详解着眼于怎么理解?和如何运用?,我对谁是卧底游戏中十类常用好用且易用的平描技法作以详解。1。偷言换字利用谐音变音外语方言缩略语等,替换掉词汇中的相应部分,再对变化后的词汇加以阐释。我关于蝴蝶效应,你还只知道那场被扇动的龙卷风吗?导语人们经常都会看到,纯粹理论研究的一点点成果,也许在很长时间之后,会导致连做该纯理论研究的科学家都始料不及的实际应用。爱德华诺顿洛伦茨他不是文学家,却在不经意间留下了一个脍炙人口