游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

  认识线程一、概念什么是线程
  一个线程就是一个执行流。每个线程之间都可以按照顺讯执行自己的代码。多个线程之间同时执行着多份代码。
  为什么要有进程?
  因为我们的系统支持多任务,这个就需要程序员来并发编程。(这里的并发编程是并行并发)。为什么要有线程
  多进程出现的问题
  通过多进程,是完全可以实现并发编程的,但是有一点问题。
  如果我们频繁的创建销毁进程,这个事情的成本是比较高的。如果我们需要频繁的调度进程,这个事情成本也是比较高的。
  创建进程就得分配资源:内存资源和文件资源。
  销毁进程就得释放资源:内存资源和文件资源。
  对于资源申请和释放,本身就是一个比较低效的操作。
  如何解决这个问题
  思路有两个:进程池(比如数据库连接池,字符串常量池)。
  进程池虽然能解决上述频繁创建和销毁的问题,但是进程池太消耗系统的资源了,因为在进程池里面有很多闲置的进程。使用线程来实现并发编程。
  线程比进程更轻量,每一个进程可以执行一个任务,每一个线程也能执行一个任务,他们都能实现并发编程。
  创建线程的成本比创建进程要低很多。
  销毁线程的成本比创建进程要低很多。
  调度线程的成本比创建进程要低很多。
  在Linux系统中,把线程称为轻量级进程(LWP)。
  为什么线程比进程更轻量
  进程的重量是重在资源的申请和释放上面。
  线程是包含在进程中的,一个进程可以有多个线程,这多个线程公用同一份资源(同一份内存文件),只是在创建进程的第一个线程的时候需要分配资源,之后进入这个进程的线程不需要再申请资源,这个时候创建线程的成本就会变低。
  这个就会有一个疑问,多加一些线程,是不是效率就会进一步提升呢?
  一般来说是会的,但是也不一定。
  如果线程多了,这些线程就会要竞争同一个资源,这个时候,整体的速度就会收到限制(整体的硬件资源是有效的)。
  线程和进程的区别和联系进程包含线程。一个进程可以有一个或者多个线程,多个线程公用同一份资源。进程和线程都是为了处理并发编程这样的场景。但是创建进程和销毁进程的效率低,而线程就比较的轻量,线程少了创建进程和销毁进程这个过程。操作系统创建进程,要给进程分配资源,进程是操作系统分配资源的最小单位。操作系统创建线程,是在CPU中执行调度,线程是CPU执行调度的基本单位。进程具有独立性,每一个进程都有各自独立的地址空间。一个进程挂了,不会影响其他的进程。但是在同一个进程中的多个线程,公用同一个内存空间。一个线程挂了,可能影响到其他的线程,甚至导致整个进程崩溃。二、创建线程
  Java中进行多线程编程,在Java标准库中,就提供了一个Thread类,用来操作线程。Thread类也可以视为是Java标准库提供的API。
  创建好的Thread实例,其实和操作系统中的线程一一对应的关系。
  操作系统提供了一组关于线程的API(C语言实现的),Java对这一组API进一步封装,就成为了Thread类。方法一继承Thread类
  创建子类,继承Thread类,并重写run方法。classMyThreadextendsThread{创建一个MyThread子类继承Thread类。Override其中run方法中的内容描述了线程内部要执行的代码publicvoidrun(){要注意的是,并不是写出这个代码,线程就创建出来了。这个是把要执行的代码准备好。System。out。println(hellothread!);}}publicclassTestDome1{publicstaticvoidmain(String〔〕args){Threadthread1newMyThread();创建MyThread子类的对象。thread1。start();当调用这里的start方法,才是真正的在系统中创建了线程。在这里才是真正的执行上面我们写的run方法中的代码。在调用start之前,系统没有创建出线程的。}}方法二实现Runnable接口
  通过Runnable来描述任务的内容,进一步的再把描述好的任务交给Thread实例classMyRunnableimplementsRunnable{继承接口Overridepublicvoidrun(){实现接口中的方法System。out。println(HelloRunnable);}}publicclassTestDome2{publicstaticvoidmain(String〔〕args){创建Thread类实例,调用Thread的构造方法时将Runnable对象作为target参数。Threadthread1newThread(newMyRunnable());thread1。start();创建线程,执行代吗}}方法三匿名内部类创建Thread子类对象publicclassTestDome3{publicstaticvoidmain(String〔〕args){ThreadthreadnewThread(){创建出这个匿名内部类的实例Override创建了一个匿名内部类,继承自Thread类,重写了run方法,publicvoidrun(){System。out。println(HelloThread!!);}};thread。start();开始执行线程}}方法四匿名内部类创建Runnable子类对象publicclassTestDome4{publicstaticvoidmain(String〔〕args){newRunnable,是针对这个创建的内部类,同时Runnable实例传给Thread的构造方法ThreadthreadnewThread(newRunnable(){Overridepublicvoidrun(){要执行的代码System。out。println(hellothread);}});thread。start();创建线程,执行代码。}}
  通常认为匿名内部类创建Runnable子类对象这中方法更好一点,能够做到让线程和线程执行的任务更好的解耦。(写代码一般希望,高内聚,低耦合)
  Runnable单纯的只是描述了一个任务,至于这个任务是要通过一个进程来执行,还是线程来执行,还是协程来执行,Runnable本身不关心。方法五使用lambda表达式publicclassTestDome6{publicstaticvoidmain(String〔〕args){Threadthread1newThread((){使用lambda表达式来代替了Runnable。System。out。println(hellothread1);});thread1。start();}}
  上面的五种写法都很常见,希望大家都能够熟悉三、线程之间并发执行publicclassTestDome5{publicstaticvoidmain(String〔〕args){Threadthread1newThread(newRunnable(){使用匿名内部类创建Runnable子类对象Overridepublicvoidrun(){while(true){如果一个循环中不加任何限制,这个循环转的速度是非常快的,我们一般看不过来我们就可以再循环中加一个sleep操作,来强制让这个线程休眠一段时间。System。out。println(hellothread);try{这个是让线程强行进入堵塞状态,单位是msThread。sleep(1000);1000ms表示1s中之内这个线程不会到CPU中执行。}catch(InterruptedExceptione){e。printStackTrace();抛出异常,线程被强制中断的异常。}}}});thread1。start();在进程中至少有一个线程,在一个Java进程中,会有一个调用main方法的线程这个线程不是人为调动的,是系统自带的。while(true){System。out。println(hellomain);try{Thread。sleep(1000);休眠一秒,线程堵塞一秒}catch(InterruptedExceptione){e。printStackTrace();}}}}
  上面这个程序是:自己创建T线程和自动创建的main线程并发执行(在宏观上看起来同时执行)。
  两个线程,都是打印一条就休眠1s,由代码运行结果图可知,当1s时间到了之后,系统先唤醒谁是不确定的(随机的)。
  对于操作系统来说,内部对于线程之间的调度顺序,在宏观上可以认为是随机的(线程之间是抢占式执行),这个随机性会给多线程编程带来很多的麻烦。四、多线程的优势增加运行速度
  可以观察多线程在一些场合下是可以提高程序的整体运行效率的。publicclassTestDome7{在写一个比较长的整数常量的时候就可以通过来进行分隔privatestaticfinallongCOUNT1000000000;定义一个常量COUNT1000000000publicstaticvoidmain(String〔〕args)throwsInterruptedException{使用串行serial();使用并行concurrency();}实现两个数自增10亿次privatestaticvoidserial(){System。currentTimeMillis()Java自带的记录当前系统的时间戳。longbeginSystem。currentTimeMillis();longa0;for(longi0;iCOUNT;i){循环10亿次a;}longb0;for(longi0;iCOUNT;i){循环10亿次b;}longendSystem。currentTimeMillis();记录系统时间System。out。println(串行:(endbegin)ms);}使用线程来实现两个数自增10亿次privatestaticvoidconcurrency()throwsInterruptedException{longbeginSystem。currentTimeMillis();记录系统时间Threadthread1newThread((){第一个线程longa0;for(longi0;iCOUNT;i){a;}});thread1。start();使用start函数,才创建了线程Threadthread2newThread((){第二个线程longb0;for(longi0;iCOUNT;i){b;}});thread2。start();在这里不能直接使用记录系统结束的时间。不要忘记了本身就有一个系统自带的mian线程因为在这里是thread1,thread2,mian线程三个线程同时抢占式执行。正确的应该是让main线程等待thread1和thread2线程结束,在记录结束时间要使用join这个函数,这个函数就是要main函数等待线程结束。thread1。join();thread2。join();longendSystem。currentTimeMillis();记录系统结束时间System。out。println(并行:(endbegin)ms);}}
  从上面的代码运行结果图可以看出来。串行执行的时候,时间大概是1700多ms。两个线程并发执行,时间大概是1000多ms,提升了接近50。
  但是并不是说,一个线程2000多ms,两个线程就是1000多ms。
  这个要根据底层到底是并行执行,还是并发执行,只有在并行执行的时候,效率才会显著提高,但是我们并不确定到底是并发,还是并行,而且还有创建线程的开销。所以并不会完完全全的提升了一半。

2亿像素新版骁龙8Gen2,小米12Ultra才是王炸!最快小米12系列已经正式发布,该系列一共发布了小米12X、小米12和小米12Pro,然而最高端的小米12Ultra却没有发布。去年小米11系列的几款机型也分为前后发布,更高配置的小……回顾影评家最青睐的十大电影(2016年),奥斯卡最大乌龙2016年电影界大事回顾:第89届奥斯卡《爱乐之城》以14项提名领跑,最终斩获六项大奖。不过,这部欢快的歌舞电影,却在奥斯卡现场遭遇历史上最大的乌龙事件。当《爱乐之……人生,七不争!《道德经》里有写:夫唯不争,故天下莫能与之争。其意思是说:唯有不争的处事态度,天下才会没有人能与之抗衡。人这一生,免不了会碰到心有不平,气有不顺的时候。但并非所有的……排除万难,我生下了我的唐氏宝宝芊芊你好,1004的读者们大家好,我叫馨馨,今年34岁,目前是一名家庭主妇,但其实这个职业并不是我的追求,五年前,我在外贸公司担任销售主管,那时我觉得人生充满光明,充满希望,但……山家除夕无他事,插了梅花便过年新的一年,除了暴富也可以抱抱我。我和你跨过分秒,愿也可以跨过余生岁月。新的一年,前路浩浩荡荡,万事尽可期待。希望2023年是很愉快的一年没有狗血情节也没有崎岖波折平平淡淡顺顺当……果然没有奇迹,大品牌RTX4070Ti电脑上架,游戏旗舰奔向最近,关于去年电脑销量的数据让大家吃惊,英特尔和AMD的出货量同比大降,全球市场对于PC的需求明显降低。在这种情况下,全球用户等来了最新一代游戏旗舰电脑,比如说装备RTX……陈可之中华英雄邓世昌等三幅油画代表作入藏国博来源:人民网人民网北京9月26日电(韦衍行)9月25日,陈可之油画作品捐赠仪式在中国国家博物馆白玉厅举行。此次,他将三幅作品《中华英雄邓世昌》《重庆大轰炸19381943……凯莉詹娜巴黎时装周上的爆款装扮凯莉詹娜最近的巴黎时装周之旅标志着这位美容巨头新时尚时代的开始。当然,她在美国的家乡支持新兴设计师,即兴拍摄服装照片,但她的工作假期有潜在的动机。她的目标是什么呢?为了完全迎合……留住核心!曝新疆男篮同摩尔特里完成续约下赛季力争重返季后赛北京时间6月22日,据知名篮球记者宋翔报道,新疆男篮同摩尔特里完成续约。在新的赛季里,新疆男篮也将向着重返季后赛的目标发起冲击。摩尔特里已在CBA征战三个赛季,相继为北控……朋友圈千万不要设置三天可见偶尔想起某位很久没联系的朋友时,我都会去看对方的朋友圈。想从朋友圈里获取一些信息,以此了解她的近况,也以此作为开场白,开启寒暄。但往往这个小心机总会落空。因为……A股再现黑色周二!但我要告诉大家,底部已出现!对此我说3点!1、今日低点就是趋势底部下午如约回补缺口,但随后却出现让人惊惧的底部砸跌!大盘最低跌至3061。51,所以即便后面1小时确实开始走V,但整体走势却没能如我提到的那般出现大……今宏电子期刊第六十五期今宏期刊第65期2020。10。2301hrUGNX新功能NX1926新功能草图02hrTeamcenter客制化如何在导出BOM到Excel的同……
山东80后宝妈巧手做花馍,月入过万!带领更多人致富山东人过春节,餐桌上必不可少的就是面食。花馍,也称面花,是广为人知的山东非物质文化遗产,花馍以多样的造型寄托人们对于美好未来的祝福。济南平阴80后女子高艳艳受家人影响,喜欢上了……OPPO注册FinShell商标,为Reno系列定制保护壳IT之家7月21日消息据外媒Letsgodigital报道,近日OPPO注册了FinShell商标,为Reno系列定制保护壳。viaLetsgodigital据Le……戴美瞳会把泪膜一分为二?!这些真相你可能还不知道美瞳算是女性日常生活中最常见的物品之一,什么魅惑电瞳、明星同款眼珠子,听起来就很有诱惑力,它也确实能让眼睛看上去更漂亮,但是前几天一则略惊悚的新闻吸引了我的注意。新闻截图……1549元,骁龙710诺基亚X7手机4GB64GB套装版开启IT之家11月30日消息诺基亚X7手机搭载了蔡司AI双摄以及骁龙710处理器,其中4GB64GB版本售价1699元,6GB64GB版本售价1899元,6GB128GB售价249……IT之家评测室一加6T手机评测律动的紫,单纯的心今天,一加在深圳举行一加6T手机国内发布会,作为一加手机的最新旗舰产品,一加6T此前已经率先在美国和其他国家市场上市销售,一加6T手机发布后就受到用户的广泛关注。在本次国内发布……一代版本一代神,索尔强度直超敖兴,成为新一代内卷王在巨龙之巢版本中,敖兴可以说是十费卡中最热门的英雄,强度一直碾压希瓦娜和索尔,所以特别卷。然而,一代版本一代神,在7月28日更新之后,索尔调整,强度直超敖兴,成为了新一代内卷王……莫言的神仙佳句,每一句都感同身受人海茫茫,也不过是父母妻子兄弟朋友。真正可怕的坏人还不是那些知道自己坏的人,而是那些不知道自己坏反而认为自己很正确很好的人。世界上很多事,有时候是想什么就来什么,有……小家电爱好者的年度总结盘点六款用了就离不开的神仙家电我真是太喜欢小家电了!主要的原因就是小家电的功能超级丰富,适合各种场景、解决各类痛点的产品可以说是层出不穷,我经常没事儿干就上购物网站上看看有什么新奇的小家电值得选购,在这个过……一加6T游戏模式3。0把RAM当ROM用IT之家11月5日消息玩手机游戏最不想遇到的就是有人来电,当然支持VoLTE的手机倒还没什么大碍,不然来电时的断网将是很难受的一个过程。为应对这样的场景,游戏模式也就应运而生。……28岁像48岁,多半是这些事做多了,及时改正,或可来得及很多年轻的女生仰仗着自己还年轻,不太注重皮肤的护理。如果你不注重肌肤的护理,肌肤就会快速的表现出衰老的状态,比如脸上过早的出现细纹,皮肤开始出现松弛等,皮肤出现的这些问题也在一……咫尺天涯原创随笔惶惶然间离开了象牙塔,成为了几千万朝九晚五大军中的一员;惶惶然间,年轮转过了一圈又一圈;蓦然回首,曾经年轻的脸被斑驳得泾渭分明,个中酸甜苦辣只能自己细细品味了。……杭州人要开始忙着吃春天?杭州的春天有多鲜中国人自古讲究不时不食。这个时节,各种春菜正在抽芽生长,它们不仅鲜嫩可口,营养也非常丰富。是时候一口鲜一口嫩地把春天吃进肚子里啦,这也是杭州人迎接春天的仪式感,一起寻找初春的鲜……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网