1. 程式人生 > >java挑戰高併發(7):java 執行緒中yield的用法

java挑戰高併發(7):java 執行緒中yield的用法

Thread.yield()方法作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。

yield()應該做的是讓當前執行執行緒回到可執行狀態,以允許具有相同優先順序的其他執行緒獲得執行機會。因此,使用yield()的目的是讓相同優先順序的執行緒之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中。

結論:yield()從未導致執行緒轉到等待/睡眠/阻塞狀態。在大多數情況下,yield()將導致執行緒從執行狀態轉到可執行狀態,但有可能沒有效果。

public class TestYield {

 public static void main(String[] args) {

   MyThread3 t1 = new MyThread3("t1");

   MyThread3 t2 = new MyThread3("t2");

   t1.start();

   t2.start();

  }

 }

 class MyThread3 extends Thread {

     MyThread3(String s) {

     super(s);

     }

   public void run() {

     for(int i = 1;i <=100; i++) {

      System.out.println(getName() + ":"+i);

      if(i == 0)

           yield();

      }

    }

  }

相關推薦

java挑戰併發7java 執行yield用法

Thread.yield()方法作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。 yield()應該做的是讓當前執行執行緒回到可執行狀態,以允許具有相同優先順序的其他執行緒獲得執行機會。因此,使用yield()的目的是讓相同優先順序的執行緒之間能適當的輪轉執行。但

Java併發——ThreadLocal為執行保駕護航

       前邊我們講述多執行緒互動,多執行緒引起的安全問題,多執行緒安全的問題解決同步(synchronized、lock、CAS)……這一切的一切起源就是共享資源,共享臨界區的資料安全引起的。那我們從另外一個角度想想呢?每個執行緒有自

Java併發volatile的實現原理 Java併發Java記憶體模型乾貨總結

synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變數修飾符,只能用來修飾變數。 volatile寫:當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。 volatile讀:當讀一

Java併發程式設計4守護執行執行阻塞的四種情況

守護執行緒Java中有兩類執行緒:User Thread(使用者執行緒)、Daemon Thread(守護執行緒) 使用者執行緒即執行在前臺的執行緒,而守護執行緒是執行在後臺的執行緒。 守護執行緒作用是為其他前臺執行緒的執行提供便利服務,而且僅在普通、非守護執行緒仍然執行時才需要,比如垃圾回收執行緒就是一個

Java併發程式設計8執行環境安全使用集合API含程式碼

Java併發程式設計(8):多執行緒環境中安全使用集合API(含程式碼)JAVA大資料中高階架構 2018-11-09 14:44:47在集合API中,最初設計的Vector和Hashtable是多執行緒安全的。例如:對於Vector來說,用來新增和刪除元素的方法是同步的。如果只有一個執行緒與Vector的例

Java 集合深入理解7ArrayList

今天心情有點美麗,學學 ArrayList 放鬆下吧! 什麼是 ArrayList ArrayList 是 Java 集合框架中 List介面 的一個實現類。 可以說 ArrayList 是我們使用最多的 List 集合,它

設計模式):單例模式 JVM類載入機制 JDK原始碼學習筆記——Enum列舉使用及原理 Java併發():雙重檢驗鎖定DCL Java併發():Java記憶體模型 Java併發():Java記憶體模型 Java併發():雙重檢驗鎖定DCL JDK原始碼學習筆記——Enum列舉使用及原理

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許一個例項存在。 單例模式一般體現在類宣告中,單例的類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要例項化該類的物件。 適用場合: 需要頻繁的進行建立和銷燬的物件; 建立物

java基礎學習總結十三Java異常處理

一、JAVA異常       異常是指不期而至的各種情況,如:檔案找不到、網路連線失敗、非法引數等。異常是一個事件,它發生在程式執行期間,干擾了正常的指令流程。Java通過API中的Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是物件,是Th

java基礎學習總結Java的反射

Native      JDK開放給使用者的原始碼中隨處可見Native方法,被Native關鍵字宣告的方法說明該方法不是以Java語言實現的,而是以本地語言實現的,Java可以直接拿來用。這裡有一個概念,就是本地語言,本地語言這四個字,個人理解應該就是可以和作業系

java調Python指令碼java通過 Runtime.getRuntime().exec調Python指令碼一直沒有返回值,卡住了,資料太大

1、背景: 當我們呼叫系統外部的某個程式,此時就可以用Runtime.getRuntime().exec()來呼叫。這次java調Python演算法程式碼時,一直沒有返回值,卡住了,而用pycharm跑Python程式碼是正常的,說明是java這邊的問題。去看了後臺的java程序一直都在,掛

java調Python指令碼java返回Python錯誤日誌

上一篇java調Python指令碼時沒有返回錯誤的日誌提醒行等,在這裡補上,主要用java.lang.Process.getErrorStream() 方法獲取子程序的錯誤流​​。資料流獲取由該Process物件表示的程序的錯誤輸出流的管道的資料。 1、java程式碼: pub

java調Python指令碼java調Python亂碼問題

java調Python返回結果出現亂碼解決: Python指令碼編碼格式已經用了utf-8,但是返回還是亂碼,說明是java這邊傳過去編碼有問題。 1、Python編碼格式: 2、一般我們中文文字編碼格式常用的有:UTF-8,GBK,GB2312。分別試一下就知道了:

Java 併發程式設計詳解執行與架構設計

內容簡介 本書主要包含四個部分: 部分主要闡述 Thread 的基礎知識,詳細介紹執行緒的 API 使用、執行緒安全、執行緒間資料通訊,以及如何保護共享資源等內容,它是深入學習多執行緒內容的基礎。 第二部分引入了 ClassLoader,這是因為 ClassLoader 與執行緒不無關係

胡八一之Java執行

多執行緒的優勢:多程序執行需要獨立的記憶體空間,而多執行緒可以共享記憶體,從而提高了執行緒的執行效率。 建立執行緒一般使用兩種方式: 1、繼承Thread類: import java.io.IOException; public class Test extends

Java併發Condition和執行順序執行

有的時候我們希望執行緒按照希望的順序依次執行,比如執行緒A,B,C,按照順序依次執行,這時候就要用到阻塞和喚醒,之前的時候我們學到過wait()和nofity/notifyAll()這兩個方法,這裡我們使用java.concurrent.locks.Lock介面

java基礎執行

1.程序、執行緒 程序:正在執行的程式 執行緒:程序中負責程式執行的執行單元 即:程序的範圍>執行緒的範圍。 且:一個程序可以有多個執行緒。 2.多執行緒的意義:多部分程式碼同時執行,提高CPU使用效率 3.多執行緒的特點:CPU的隨機性 4.建立執行緒的兩種方法

深入理解java虛擬機器系列java記憶體區域與記憶體溢位異常

文章主要是閱讀《深入理解java虛擬機器:JVM高階特性與最佳實踐》第二章:Java記憶體區域與記憶體溢位異常 的一些筆記以及概括。 好了開始。如果有什麼錯誤或者遺漏,歡迎指出。 一、概述 先上一張圖 這張圖主要列出了Java虛擬機器管理的記憶體的幾個區域。 常有人

《瘋狂Java講義》讀書筆記執行,網路程式設計,類載入機制與反射

第十六章:多執行緒1、一般而言,程序包含如下3個特徵:獨立性,動態性,併發性。併發性和並行性是兩個概念,並行指同一時刻,有多條指令在多個處理器上同時執行;併發指同一時刻只能有一條指令執行,但多個程序指令

深入Java虛擬機器筆記Java記憶體區域與記憶體溢位異常

1、程式計數器為很小的記憶體空間,為當前執行緒執行的位元組碼的行號指示器,通過改變計數器的值來選取下一條需要執行的位元組碼指令,迴圈、分支等基礎功能都是需要計數器來完成的 2、Java虛擬機器棧為Java方法執行的記憶體模型,每個方法被執行時都會同時建立棧

openCV學習筆記7cvRectangle與cv::rectangle的用法

在第一次使用cvRectangle繪製矩形的時候遇到一個問題:Error:不存在從“cv::Mat”到"CvArr*"的適當轉換函式,就特意查了查資料,總結如下。 cvRentangle和cv::rectangle函式原型對比: C:       void cvRectan