摘要:先看一下源碼是一個方法也就是說是或者實現的概念當調用的時候,會給線程調度器一個當前線程愿意出讓的使用的暗示,但是線程調度器可能會忽略這個暗示。
先看一下源碼 yield()是一個native方法也就是說是C或者C++實現的
/** * 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-utilise a CPU. Its use * should be combined with detailed profiling and benchmarking to * ensure that it actually has the desired effect. * *
It is rarely appropriate to use this method. It may be useful * for debugging or testing purposes, where it may help to reproduce * bugs due to race conditions. It may also be useful when designing * concurrency control constructs such as the ones in the * {@link java.util.concurrent.locks} package. */ public static native void yield();
概念: 當調用Thread.yield()的時候,會給線程調度器一個當前線程愿意出讓CPU的使用的暗示,但是線程調度器可能會忽略這個暗示。
代碼
public class Demo3 { public static void main(String[] args) throws ExecutionException, InterruptedException { Runnable runnable = new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println("當前線程為: "+ Thread.currentThread().getName()+ i); if (i == 5){ Thread.yield(); } } } }; Thread thread = new Thread(runnable,"A"); Thread thread1 = new Thread(runnable,"B"); thread.start(); thread1.start(); } }
第一次執行結果
當前線程為: A0
當前線程為: B0
當前線程為: A1
當前線程為: B1
當前線程為: A2
當前線程為: B2
當前線程為: A3
當前線程為: B3
當前線程為: A4
當前線程為: B4
當前線程為: A5
當前線程為: B5
當前線程為: A6
當前線程為: B6
當前線程為: A7
當前線程為: B7
當前線程為: B8
當前線程為: A8
當前線程為: A9
當前線程為: B9
第二次執行結果
當前線程為: B0
當前線程為: B1
當前線程為: B2
當前線程為: B3
當前線程為: B4
當前線程為: B5
當前線程為: B6
當前線程為: B7
當前線程為: B8
當前線程為: B9
當前線程為: A0
當前線程為: A1
當前線程為: A2
當前線程為: A3
當前線程為: A4
當前線程為: A5
當前線程為: A6
當前線程為: A7
當前線程為: A8
當前線程為: A9
第三次執行結果
當前線程為: A0
當前線程為: A1
當前線程為: A2
當前線程為: A3
當前線程為: A4
當前線程為: A5
當前線程為: A6
當前線程為: A7
當前線程為: A8
當前線程為: A9
當前線程為: B0
當前線程為: B1
當前線程為: B2
當前線程為: B3
當前線程為: B4
當前線程為: B5
當前線程為: B6
當前線程為: B7
當前線程為: B8
當前線程為: B9
第四次執行結果
當前線程為: A0
當前線程為: A1
當前線程為: A2
當前線程為: A3
當前線程為: A4
當前線程為: A5
當前線程為: A6
當前線程為: A7
當前線程為: A8
當前線程為: A9
當前線程為: B0
當前線程為: B1
當前線程為: B2
當前線程為: B3
當前線程為: B4
當前線程為: B5
當前線程為: B6
當前線程為: B7
當前線程為: B8
當前線程為: B9
第五次執行結果
當前線程為: A0
當前線程為: B0
當前線程為: A1
當前線程為: B1
當前線程為: A2
當前線程為: B2
當前線程為: A3
當前線程為: B3
當前線程為: A4
當前線程為: B4
當前線程為: A5
當前線程為: B5
當前線程為: A6
當前線程為: B6
當前線程為: A7
當前線程為: B7
當前線程為: B8
當前線程為: A8
當前線程為: A9
當前線程為: B9
說明每次執行的可能都不一樣,但是當執行到i == 5時候當前線程可能繼續執行也可能讓B執行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/75063.html
摘要:,看到很多文章把理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。如下在中我們可以看到官方的解釋,更多的是作為調試或測試時候使用也就是瘋狂重分配,提高切換概率,模擬并發 yield,看到很多文章把yield理解為暫停,其實是不準確的,翻譯過來用讓步更為準確一些。簡單描述下其作用: 使調用yield的正在執行的線程讓出cpu,讓同等優先權的其他線程包括自身重新進行分配調度 概念性的...
摘要:告訴當前執行的線程為線程池中其他具有相同優先級的線程提供機會。不能保證會立即使當前正在執行的線程處于可運行狀態。當達到超時時間時,主線程和是同樣可能的執行者候選。下一篇并發編程線程安全性深層原因 Thread 使用Java的同學對Thread應該不陌生了,線程的創建和啟動等這里就不講了,這篇主要講幾個容易被忽視的方法以及線程狀態遷移。 wait/notify/notifyAll 首先我...
摘要:線程線程是進程中的一個實體,作為系統調度和分派的基本單位。下的線程看作輕量級進程。因此,使用的目的是讓相同優先級的線程之間能適當的輪轉執行。需要注意的是,是線程自己從內部拋出的,并不是方法拋出的。 本文及后續相關文章梳理一下關于多線程和同步鎖的知識,平時只是應用層面的了解,由于最近面試總是問一些原理性的知識,雖說比較反感這種理論派,但是為了生計也必須掌握一番。(PS:并不是說掌握原理不...
摘要:如果線程還存活,線程就無限期等待,并讓出監視器鎖,進入狀態。當線程從狀態被喚醒后通過,或者是假喚醒將繼續競爭監視器鎖,當成功獲得監視器鎖后,他將從調用的地方恢復,繼續運行。 前言 系列文章目錄 上一篇我們討論了線程的創建,本篇我們來聊一聊線程的狀態轉換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應當有能力回答以...
摘要:當線程執行完后進入狀態,表示線程執行結束。其中和表示兩個線程。但要注意,讓出并不表示當前線程不執行了。關鍵字其作用是防止指令重排和使線程對一個對象的修改令其他線程可見。 JMM特性一覽 Java Memory Model的關鍵技術點都是圍繞著多線程的原子性、可見性和有序性來建立的。因此我們首先需要來了解這些概念。 原子性(Atomicity) 原子性是指一個操作是不可中斷的。即使是在多...
閱讀 1740·2021-10-18 13:30
閱讀 2621·2021-10-09 10:02
閱讀 2969·2021-09-28 09:35
閱讀 2097·2019-08-26 13:39
閱讀 3529·2019-08-26 13:36
閱讀 1956·2019-08-26 11:46
閱讀 1139·2019-08-23 14:56
閱讀 1700·2019-08-23 10:38