电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java線程中yield與join方法的區別

瀏覽:5日期:2022-09-06 09:17:38

長期以來,多線程問題頗為受到面試官的青睞。雖然我個人認為我們當中很少有人能真正獲得機會開發復雜的多線程應用(在過去的七年中,我得到了一個機會),但是理解多線程對增加你的信心很有用。之前,我討論了一個wait()和sleep()方法區別的問題,這一次,我將會討論join()和yield()方法的區別。坦白的說,實際上我并沒有用過其中任何一個方法,所以,如果你感覺有不恰當的地方,請提出討論。

Java線程調度的一點背景

在各種各樣的線程中,Java虛擬機必須實現一個有優先權的、基于優先級的調度程序。這意味著Java程序中的每一個線程被分配到一定的優先權,使用定義好的范圍內的一個正整數表示。優先級可以被開發者改變。即使線程已經運行了一定時間,Java虛擬機也不會改變其優先級

優先級的值很重要,因為Java虛擬機和下層的操作系統之間的約定是操作系統必須選擇有最高優先權的Java線程運行。所以我們說Java實現了一個基于優先權的調度程序。該調度程序使用一種有優先權的方式實現,這意味著當一個有更高優先權的線程到來時,無論低優先級的線程是否在運行,都會中斷(搶占)它。這個約定對于操作系統來說并不總是這樣,這意味著操作系統有時可能會選擇運行一個更低優先級的線程。(我憎恨多線程的這一點,因為這不能保證任何事情)

注意Java并不限定線程是以時間片運行,但是大多數操作系統卻有這樣的要求。在術語中經常引起混淆:搶占經常與時間片混淆。事實上,搶占意味著只有擁有高優先級的線程可以優先于低優先級的線程執行,但是當線程擁有相同優先級的時候,他們不能相互搶占。它們通常受時間片管制,但這并不是Java的要求。

理解線程的優先權

接下來,理解線程優先級是多線程學習很重要的一步,尤其是了解yield()函數的工作過程。

記住當線程的優先級沒有指定時,所有線程都攜帶普通優先級。優先級可以用從1到10的范圍指定。10表示最高優先級,1表示最低優先級,5是普通優先級。記住優先級最高的線程在執行時被給予優先。但是不能保證線程在啟動時就進入運行狀態。與在線程池中等待運行機會的線程相比,當前正在運行的線程可能總是擁有更高的優先級。由調度程序決定哪一個線程被執行。t.setPriority()用來設定線程的優先級。記住在線程開始方法被調用之前,線程的優先級應該被設定。你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY來設定優先級

現在,當我們對線程調度和線程優先級有一定理解后,讓我們進入主題。

yield()方法

理論上,yield意味著放手,放棄,投降。一個調用yield()方法的線程告訴虛擬機它樂意讓其他線程占用自己的位置。這表明該線程沒有在做一些緊急的事情。注意,這僅是一個暗示,并不能保證不會產生任何影響。

在Thread.java中yield()定義如下:

/** * A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore * this hint. Yield is a heuristic attempt to improve relative progression between threads that would otherwise over-utilize a CPU. * Its use should be combined with detailed profiling and benchmarking to ensure that it actually has the desired effect. */public static native void yield();

讓我們列舉一下關于以上定義重要的幾點:

Yield是一個靜態的原生(native)方法Yield告訴當前正在執行的線程把運行機會交給線程池中擁有相同優先級的線程。Yield不能保證使得當前正在運行的線程迅速轉換到可運行的狀態它僅能使一個線程從運行狀態轉到可運行狀態,而不是等待或阻塞狀態yield()方法使用示例

在下面的示例程序中,我隨意的創建了名為生產者和消費者的兩個線程。生產者設定為最小優先級,消費者設定為最高優先級。在Thread.yield()注釋和非注釋的情況下我將分別運行該程序。沒有調用yield()方法時,雖然輸出有時改變,但是通常消費者行先打印出來,然后事生產者。

調用yield()方法時,兩個線程依次打印,然后將執行機會交給對方,一直這樣進行下去。

package test.core.threads;public class YieldExample{ public static void main(String[] args) { Thread producer = new Producer(); Thread consumer = new Consumer(); producer.setPriority(Thread.MIN_PRIORITY); //Min Priority consumer.setPriority(Thread.MAX_PRIORITY); //Max Priority producer.start(); consumer.start(); }}class Producer extends Thread{ public void run() { for (int i = 0; i < 5; i++) { System.out.println('I am Producer : Produced Item ' + i); Thread.yield(); } }}class Consumer extends Thread{ public void run() { for (int i = 0; i < 5; i++) { System.out.println('I am Consumer : Consumed Item ' + i); Thread.yield(); } }}上述程序在沒有調用yield()方法情況下的輸出:

I am Consumer : Consumed Item 0 I am Consumer : Consumed Item 1 I am Consumer : Consumed Item 2 I am Consumer : Consumed Item 3 I am Consumer : Consumed Item 4 I am Producer : Produced Item 0 I am Producer : Produced Item 1 I am Producer : Produced Item 2 I am Producer : Produced Item 3 I am Producer : Produced Item 4上述程序在調用yield()方法情況下的輸出:

I am Producer : Produced Item 0 I am Consumer : Consumed Item 0 I am Producer : Produced Item 1 I am Consumer : Consumed Item 1 I am Producer : Produced Item 2 I am Consumer : Consumed Item 2 I am Producer : Produced Item 3 I am Consumer : Consumed Item 3 I am Producer : Produced Item 4 I am Consumer : Consumed Item 4join()方法

線程實例的方法join()方法可以使得在另一個線程的執行結束后再開始執行這個線程。如果join()方法被在一個線程實例上調用,當前運行著的線程將阻塞直到線程實例完成了執行。

//Waits for this thread to die.public final void join() throws InterruptedException

在join()方法內設定超時,使得join()方法的影響在特定超時后無效。當超時時,主方法和任務線程申請運行的時候是平等的。然而,當涉及sleep時,join()方法依靠操作系統計時,所以你不應該假定join()方法將會等待你指定的時間。

像sleep,join通過拋出InterruptedException對中斷做出回應。

join()方法使用示例

package test.core.threads;public class JoinExample{ public static void main(String[] args) throws InterruptedException { Thread t = new Thread(new Runnable() { public void run() { System.out.println('First task started'); System.out.println('Sleeping for 2 seconds'); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('First task completed'); } }); Thread t1 = new Thread(new Runnable() { public void run() { System.out.println('Second task completed'); } }); t.start(); // Line 15 t.join(); // Line 16 t1.start(); }}Output:First task startedSleeping for 2 secondsFirst task completedSecond task completed

這是一些很小卻很重要的概念。在評論部分讓我知道你的想法。

標簽: Java
相關文章:
主站蜘蛛池模板: 精密五金加工厂-CNC数控车床加工_冲压件|蜗杆|螺杆加工「新锦泰」 | 新密高铝耐火砖,轻质保温砖价格,浇注料厂家直销-郑州荣盛窑炉耐火材料有限公司 | ICP备案查询_APP备案查询_小程序备案查询 - 备案巴巴 | 东莞海恒试验仪器设备有限公司 | 艺术涂料_进口艺术涂料_艺术涂料加盟_艺术涂料十大品牌 -英国蒙太奇艺术涂料 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 防水套管厂家-柔性防水套管-不锈钢|刚性防水套管-天翔管道 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 宜兴市恺瑞德环保科技有限公司| 青岛成人高考_山东成考报名网| 色油机-色母机-失重|称重式混料机-称重机-米重机-拌料机-[东莞同锐机械]精密计量科技制造商 | 液压油缸-液压缸厂家价格,液压站系统-山东国立液压制造有限公司 液压油缸生产厂家-山东液压站-济南捷兴液压机电设备有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 东莞海恒试验仪器设备有限公司| 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 磁力抛光机_磁力研磨机_磁力去毛刺机-冠古设备厂家|维修|租赁【官网】 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 截齿|煤截齿|采煤机截齿|掘进机截齿|旋挖截齿-山东卓力截齿厂家报价 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 天津云仓-天津仓储物流-天津云仓一件代发-顺东云仓 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 步入式高低温测试箱|海向仪器 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀| 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 打包箱房_集成房屋-山东佳一集成房屋有限公司| 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | MVE振动电机_MVE震动电机_MVE卧式振打电机-河南新乡德诚生产厂家 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 福州时代广告制作装饰有限公司-福州广告公司广告牌制作,福州展厅文化墙广告设计, | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 |