应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Java多线程常用方法梳理

  1中断1。1interrupt
  将线程的状态设置为中断,并不是直接停止非阻塞的运行中的线程。当线程进入该中断状态,且被Thread。join和Thread。sleep,Object。wait阻塞时该线程立即会抛出InterruptedException中断异常,从而提早终结阻塞状态。相反如果线程没有被阻塞,调用此方法时将不起作用,直到遇到wait,sleep,join等场景才会抛出InterruptedException中断异常停止运行中的线程。(如同设置一个前哨,如果遇到阻塞马上中断)使用方式Thread。currentThread()。interrupt();1。2interrupted源码publicstaticbooleaninterrupted(){测试某些线程是否已中断。中断状态是否根据传递的ClearInterrupted值重置。returncurrentThread()。isInterrupted(true);}
  测试当前线程是否已中断。此方法将清除线程的中断状态。换言之,如果连续两次调用此方法,则第二次调用将返回false(除非当前线程在第一次调用清除其中断状态之后且在第二次呼叫检查它之前再次中断)。由于线程在中断时不活动而忽略的线程中断将由返回false的方法反映。1。3isInterrupted源码publicbooleanisInterrupted(){测试某些线程是否已中断。中断状态是否根据传递的ClearInterrupted值重置。returnisInterrupted(false);}
  测试此线程是否已中断。线程的中断状态不受此方法的影响。由于线程在中断时不活动而忽略的线程中断将由返回false的方法反映。
  1。4一段代码搞清interrupt、interrupted、isInterrupted的关系Testvoidinterrupted(){设置中断标志位Thread。currentThread()。interrupt();判断当前线程是否处于中断状态trueSystem。out。println(Thread。currentThread()。isInterrupted());清理中断标志位(返回是否清理成功)trueSystem。out。println(Thread。interrupted());再次清理falseSystem。out。println(Thread。interrupted());判断当前线程是否处于中断状态falseSystem。out。println(Thread。currentThread()。isInterrupted());}2sleep
  阻塞当前正在运行的线程一段时间(该时间可以指定),它不会释放以获取到的锁。当阻塞时间到后会继续执行当前线程的后续逻辑。
  在无锁状态下也可以直接调用此方法。实现线程的阻塞。每隔1秒打印一次时间Testvoidsleep()throwsInterruptedException{for(inti0;i10;i){DateFormatformatternewSimpleDateFormat(yyyyMMddHH:mm:ss);DatedatenewDate();Stringformatformatter。format(date);System。out。println(format);阻塞线程1sTimeUnit。SECONDS。sleep(1);}}3wait
  wait会阻塞当前线程,并且不会释放当前持有的锁。它与sleep不同的是,该方法必须通过锁对象来调用,不可无锁调用。wait()与wait(longtimeout)的区别在于无参方法必须通过notify()或notifyAll()来唤醒当前等待线程,而有参方法可以等待指定的时间后自动唤醒等待线程去争夺锁。TestpublicvoidtestWait(){对象finalBigDecimallocknewBigDecimal(10);ThreadthreadAnewThread((){synchronized(lock){System。out。println(我被线程A正在执行);try{该线程会放弃对象锁,该线程会被挂起lock。wait();}catch(InterruptedExceptione){thrownewRuntimeException(e);}System。out。println(如果我被打印,说明我被唤醒了);}});启动线程AthreadA。start();ThreadthreadBnewThread((){线程B争夺该对象的锁synchronized(lock){System。out。println(我被线程B正在执行);线程B会唤醒该对象的lock。notify();}});threadB。start();}
  运行结果
  例:模拟闭锁,主线程等待10个子线程执行完毕之后,主线程继续向下执行。且主线程最多等待10秒,若子线程在10秒内未完成将自动向下执行。模拟主线程执行逻辑publicclassMyWait{staticfinalObjectlocknewObject();publicstaticvoidmain(String〔〕args)throwsInterruptedException{System。out。println(进入主线程);计数器AtomicIntegercountnewAtomicInteger(0);启动10个子线程MyWaitSonmyWaitSonnewMyWaitSon(lock,count);for(inti1;i10;i){ThreadsonThreadnewThread(myWaitSon,soni);sonThread。start();}主线程挂起,且最多等待10ssynchronized(lock){lock。wait(10000L);System。out。println(主线程继续启动);}}}模拟子线程执行逻辑publicclassMyWaitSonimplementsRunnable{finalObjectlock;finalAtomicIntegercount;publicMyWaitSon(Objectlock,AtomicIntegercount){this。locklock;this。countcount;}Overridepublicvoidrun(){System。out。println(子线程启动了);synchronized(lock){System。out。println(当前线程为:Thread。currentThread()。getName(),count:count。incrementAndGet());通过计数器到达10个后唤醒主线程if(count。get()10){lock。notify();System。out。println(子线程唤醒主线程);}}}}进入主线程子线程启动了子线程启动了当前线程为:son1,count:1子线程启动了当前线程为:son2,count:2子线程启动了当前线程为:son3,count:3子线程启动了当前线程为:son4,count:4子线程启动了当前线程为:son5,count:5当前线程为:son6,count:6子线程启动了当前线程为:son7,count:7子线程启动了当前线程为:son8,count:8子线程启动了当前线程为:son9,count:9子线程启动了当前线程为:son10,count:10子线程唤醒主线程主线程继续启动4join
  在多线程环境下,需要等待某一个线程执行完毕后才能继续向下执行逻辑,那么这种场景就可以使用join。
  为了更加形象的说明,我们看图说话,如上图所示有三个线程,执行完毕的时间分别是5s、3s、10s。
  当运行到第3s时,Thread2执行完毕,Thread1、3正在执行。
  当运行到第5s时,Thread1执行完毕,Thread2等待了2s,Thread3正在执行。
  当运行到第10s时,Thread3执行完毕,Thread1等待了5s,Thread2等待了7s。
  当主线程从第10s之后再开始执行后续逻辑。那么这种场景就适合join来实现。
  示例代码如下publicstaticvoidmain(String〔〕args)throwsInterruptedException{线程1Threadthread1newThread((){try{TimeUnit。SECONDS。sleep(5);System。out。println(线程1执行完毕);}catch(InterruptedExceptione){thrownewRuntimeException(e);}},thread1);线程2Threadthread2newThread((){try{TimeUnit。SECONDS。sleep(3);System。out。println(线程2执行完毕);}catch(InterruptedExceptione){thrownewRuntimeException(e);}},thread2);线程3Threadthread3newThread((){try{TimeUnit。SECONDS。sleep(10);System。out。println(线程3执行完毕);}catch(InterruptedExceptione){thrownewRuntimeException(e);}},thread3);主线程准备启动三个子线程thread1。start();thread2。start();thread3。start();主线程等待thread1、2、3执行结束thread1。join();thread2。join();thread3。join();主线程继续执行System。out。println(主线程执行结束);}线程2执行完毕线程1执行完毕线程3执行完毕主线程执行结束5yield
  yieId在实际生产中使用不多,它的作用是将当前线程CPU的执行权让出给其它线程。
  例如当前线程正常循环打印010000的耗时要远远小于使用yieId方法打印的耗时publicstaticvoidmain(String〔〕args)throwsInterruptedException{ThreadthreadnewThread((){for(inti0;i10000;i){System。out。println(i);使用yield方法Thread。yield();}});longstartTimeSystem。currentTimeMillis();thread。start();thread。join();System。out。println(总耗时:(System。currentTimeMillis()startTime));}
  未使用yield方法耗时70毫米左右,当使用yield方法后会达到100毫秒以上。
  收藏吃灰去吧

龙虎榜丨2。57亿资金抢筹四川长虹,机构狂买宇通客车(名单)3月28日,上证指数下跌0。19,深证成指下跌0。72,创业板指下跌1。2。盘后龙虎榜数据显示,共有43只个股因当日异动登上龙虎榜,资金净流入最多的是四川长虹(600839。S……扬州生态科技新城凤凰腾飞,荣升4A再升级来源:【交汇点新闻客户端】交汇点讯作为大运河的衍生水系,扬州生态科技新城七河八岛水域是大运河孕育的一块夺天地之造化的风水宝地。而地处七河八岛核心区的凤凰岛,以京杭大运河分……拐卖了25年的孩子在优越的家庭长大,找到时他愿意回生父家吗?刘德华在电影《失孤》中扮演一个孜孜不倦寻子的父亲,这一找就是15年。如果说15年是一个非常漫长的时间的话,那么今天我们要说的这位寻子父亲花的时间是特别漫长了,足足25年。……腾讯视频投诉量超万条,网友今年315没有爱优腾我不看!2023年开年,视频平台负面消息不断。继爱奇艺、优酷后,腾讯视频在通过《三体》收割新会员的同时,也被老会员因多设备登录被封号需花钱解封骂上了热搜,多位网友反映腾讯视频吃相……早生华发?这些中药里的乌发高手,你认识多少!乌发是指改善须发的干枯、黄、灰、白的状况,使须发黑亮、润泽、柔软、有韧性。我国大多数民族都为黑发,正常生长的毛发为黑色,或黑中带有褐色。少数人头发为褐色,只要有光泽、活力,就属……我是女人伊朗女足门将喊冤,称约旦输不起就胡乱猜测据外媒11月17日报道,在约旦提出指控后,伊朗女子足球国家队的一名足球运动员坚称自己是女性。根据《印度时报》的消息,印度要求亚足联对伊朗女子足球队守门员佐赫雷库代伊(Zohre……中国代表团压轴冬奥会开幕式!穿中国红点燃鸟巢,新造型彻底封神影响穿衣造型的因素有很多,但是要说当下效果最快,且最吸引人的还得是色彩,还得是红色,不同于别的超高饱和度色彩,红色有着喜庆、热闹的寓意,每每到重要时刻,尤其是在新年这个时候,红……巨石阵或许是一个巨大的乐器钟琴一直以来,人类对巨石阵的研究从未停止,人类琢磨了几千年,也一直没能搞懂它到底是干啥的。经过勘测分析,在新石器时代,巨石阵就已经出现在英国了,此后每隔千年左右,就会重新修葺……朱元璋封官(民间传说)朱元璋,出生在安徽凤阳,世代为农,生活贫苦。据元代规定,底层汉族庶民,如果没有文化和地位,无官无职,不得取名,只能把父母的年龄加起来的数字之和起做名字。而朱元璋是家里第四个孩子……吃多宝鱼原来有这么多好处多宝鱼原产于欧洲,主要分布在大西洋流域,是世界上公认的比目鱼之一,它的营养价值是非常高的,含有很多的营养物质,在欧洲受到很多人的喜爱,那么,多宝鱼的营养价值到底有哪些呢?……发现非洲之美,塞伦盖蒂大草原的动物王国非洲的美有很多很多,因为离我们距离遥远,所有国人去非洲旅游的不是很多,不过在疫情以前,已经有很多旅行社组织和自由行去非洲旅游了,当然和去东南亚、欧美的流量不能比,去非洲旅游主要……不要再用你蹩脚的英语发音误导孩子了,试试这款有道听力宝吧孩子进入了三年级,开始接触英语的学习了,而初学时候很难掌握一门新语言,缺少交流的环境和耳闻目染的学习氛围,所以很多时候面临着难以入门的尴尬。机友之前也给孩子报了培训机构,……
在篮网仅获得1分钟上场时间的前锋韦尼恩,来湖人后,是这种表现湖人今日再战快船,却以111:132,又吃到一场大败,目前他们战绩变为27胜35负,排在西部第9位,后面的鹈鹕开拓者正虎视眈眈盯着紫金。要是湖人今天输给的对手是坐拥健康乔……原来华为是对的!台积电正式宣布,全球首款3D芯片来了本文原创,禁止抄袭,违者必究!就在2021年5月18日,华为公司公开了一种名为双芯叠加的技术专利,这种技术理论上通过将两颗14nm芯片叠加,从而让叠加起来的芯片在性能上达……我国成功发射遥感三十四号02星,为中国航天点赞IT之家3月17日消息,今日15时09分,我国在酒泉卫星发射中心用长征四号丙运载火箭,成功将遥感三十四号02星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功。此次任务是长……CBA北京首钢送新疆大礼,也把自己逼入尴尬境地,打山东你让不3月18日在CBA北京首钢与新疆队的比赛中,此前三连胜的首钢队随随便便的输给了新疆队。凭借此场胜利新疆队又燃起了冲击季后赛的希望,现在山东、天津、新疆都有机会进入12强,但3选……新加坡旅游圣淘沙岛Sentosa这座位于新加坡南部岸外的小岛,在命名为圣淘沙之前,原为英国的军事要塞。二战期间,新加坡一度被日军所占领,而后重归英国管辖,英国殖民政府此后将小岛更名为圣淘沙(Sentosa),……40岁女人怎么把阔腿裤穿得更时髦?5个穿搭技巧,教你穿好看对于40岁的女人来说,阔腿裤和半身裙都是夏天出场率极高的下装单品;之前为大家分享了半身裙的穿搭,而今天,我们要学习的就是阔腿裤的穿搭方法!40岁女人怎么把阔腿裤穿得更时髦……研究人员通过直接观察西格玛孔完成了成像研究人员首次成功直接完成sigamhole成像,即电子电荷包围住某个特定原子的各向异性模式。(图片来源:T。Bellon捷克有机化学和生物化学学会(IOCBPrague)……社会主义国家如何发展和利用数字资本,可采取哪些策略?文春尽安编辑文知远今天咱们聊一聊,社会主义国家发展和利用数字资本的策略。一、持续把发展数字经济作为国家重要发展战略现实来看,发展和利用数字资本,就是要长……改变一下真的精致了很多!今天来设计一下眉形,非常杂乱。你们都说我的眉形丑,今天来设计一下眉形,非常杂乱。选择了很有名的久匠,环境高端大气很舒服,都是独立包间,小姐姐的技术真的非常杂乱。而且会根据……华为nova11系列来了,美学科技实用性引领档位创新中新经纬4月17日电17日下午,华为举办nova11系列及全场景新品发布会,发布全新华为nova11系列新机。会上发布的新机共有3款,分别为华为nova11、华为nova……水美原乡自在姚庄,郏县第二届姚庄旅游区樱花节开幕河南日报客户端记者张建新河南日报社全媒体记者王冰珂茶韵姚庄,玉泉幽长;美食飘香,乐曲芬芳。4月7日,在国家4A级景区郏县姚庄,以水美原乡自在姚庄为主题的该县第二届姚庄旅游……余杭这个小村庄火了!有人专门坐两小时车,去看100多岁的它!来源:【看余杭】前两天,网友小褚热心地告诉小编,余杭有一个特别治愈的小村庄,仿佛闯入了宫崎骏的漫画。图源抖音念一一随着天气暖和起来,一……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网