Thread.yield()

(一)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.** <p> 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.** <p> 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.*/

大致意思:yield()方法會通知線程調度器放棄對處理器的占用,但調度器可以忽視這個通知。yield()方法主要是為了保障線程間調度的連續性,防止某個線程一直長時間占用cpu資源。但是他的使用應該基于詳細的分析和測試。這個方法一般不推薦使用,它主要用于debug和測試程序,用來減少bug以及對于并發程序結構的設計。

(二)方法理解:

Thread.yield()翻譯成中文就是讓步的意思,根據語義理解就是線程讓出當前時間片給其他線程執行。這個函數在JSL中未給出明確的語義,就是沒有要求具體如何實現,這取決于各個不同jvm的具體實現。部分jvm在執行這個函數時可能什么都不做,但是大部分jvm的實現都是:將線程從running狀態轉為runnable狀態,然后放入同優先級等待隊列的末尾,等待前面所有相同優先級的線程調度完成后才可能再度獲得執行機會。不過當同優先級隊列中剛好只剩這個線程時,那么這個線程可能很快就又獲得了cpu時間片。我們常用的HotSpot默認采用的是第二種方式。

我們再看個小例子:

public class YieldTest extends Thread {public YieldTest(String name) {super(name);}@Overridepublic void run() {for (int i = 1; i <= 1000; i++) {System.out.println("" + this.getName() + "-----" + i);if (i == 30 || i == 100 || i == 500 || i == 700 || i == 800 || i == 900) {Thread.yield();}}}public static void main(String[] args) {YieldTest yt1 = new YieldTest("張三");YieldTest yt2 = new YieldTest("李四");yt1.start();yt2.start();}
}

運行結果:

我們會驚奇的發現:調用Thread.yield()后線程并不一定會立刻停止執行,i == 100時調用Thread.yield()后線程沒有立刻放棄cpu時間片,李四這個無恥之徒還在執行呢!

這個主要是因為張三從runnable狀態切換到running狀態是需要一些準備的,這個需要耗費一些時間。系統為了避免cpu資源的浪費還會讓李四在執行一小段時間。不過調度器后面一定會讓張三執行下的,面子工程必須得做的。所以就如同yield()方法注釋中說的,業務代碼使用這個函數需慎重。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WSDL 詳解

轉載自&#xff1a;http://kalogen.javaeye.com/blog/418958 WSDL (Web Services Description Language,Web服務描述語言)是一種XML Application&#xff0c;他將Web服務描述定義為一組服務訪問點&#xff0c;客戶端可以通過這些服務訪問點對包含面向文檔信息或面向過程調用的服…

MySQL數據類型char與varchar中數字代表的究竟是字節數還是字符數?

https://blog.csdn.net/zyz511919766/article/details/51682407 轉載于:https://www.cnblogs.com/zquan/p/9723082.html

傳蘋果新iPhone顯示屏4英寸 可視面積擴大30%

摘要&#xff1a;北京時間5月17日凌晨消息&#xff0c;據熟知內情的消息人士周三稱&#xff0c;蘋果計劃為其下一代iPhone使用更大的顯示屏&#xff0c;并已開始從韓國和日本供應商那里訂購新的顯示屏。業績人士指出&#xff0c;蘋果為下一代iPhone配備更大顯示屏的決定意味著&…

Ztree

引入css和js <link rel"stylesheet" href"/${appName}/commons/jslib/ztreeV3.5.15/css/zTreeStyle/zTreeStyle.css" type"text/css"></link> <script type"text/javascript" src"/${appName}/commons/jslib/ztre…

通過IDE生成和手動call調用webservice

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 通過IDE自動生成的代碼調用webservice服務 我們的IDE一般來說都是能夠通過各種各樣的工具來支持我們的開發使我們的開發變得更加的便捷。…

前端性能優化之Lazyload

前端性能優化之Lazyload (Mob前端-冬晨)[JavaScript|技術分享|懶加載] [TOC] Lazyload 簡介 前端工作中&#xff0c;界面和效果正在變得越來越狂拽炫酷&#xff0c;與此同時性能也是不得不提的問題。有些項目&#xff0c;頁面長&#xff0c;圖片多&#xff0c;內容豐富。像商城…

mysql查最大字符串

select MAX(comp_code0) from t_base_company字符串 0 把字符串轉成數字轉載于:https://www.cnblogs.com/feifeicui/p/9726401.html

中國聯通被指亂扣費 返還金額限制用

摘要&#xff1a;宋先生的聯通卡開通的是30G加100MB流量的套餐&#xff0c;宋先生上網認真核實了手機清單&#xff0c;發現近期上網流量從未超出。這回聯通客服的解釋是&#xff1a;“亂扣的費用已經在4月29日返還到你的卡里&#xff0c;這筆費用為‘隱藏扣費’&#xff0c;你是…

JAVA使用FTPClient類讀寫FTP

見&#xff1a;http://blog.csdn.net/kardelpeng/article/details/6588284 1.首先先導入相關jar包 2.創建一個連接FTP的工具類FTPUtil.Java [java] view plaincopy package com.metarnet.ftp.util; import java.io.IOException; import java.io.InputStream; import j…

揭秘一線互聯網企業 前端JavaScript高級面試

第1章 課程介紹本章主要介紹課程的知識大綱&#xff0c;每個章節的解決順序和主要內容。1-1 導學1-2 課程重要提示1-3 架構 第2章 ES6 語法本章主要講解工作中最常用的 ES6 語法&#xff0c;包括 Module Class Promise 等語法&#xff0c;還會介紹使用 babel webpack rollup 來…

Java IO類庫之ObjectInputStream和ObjectOutPutStream

2019獨角獸企業重金招聘Python工程師標準>>> 一、ObjectOutputStream 1 - ObjectOuputStream介紹 ObjectOutputStream(對象字節輸出流)&#xff0c;用于將一個序列化對象寫入到創建ObjectOutputStream時傳入的底層字節輸入流中&#xff0c;通過源碼可知該類繼承Outp…

什么是覆蓋索引?如何利用覆蓋索引進行SQL語句優化?

如果你不知道什么是覆蓋索引&#xff0c;那么SQL性能優化便無從談起&#xff01; 什么是覆蓋索引?如何利用索引進行SQL語句優化&#xff1f; 表結構 150多萬的數據&#xff0c;這么一個簡單的語句&#xff1a; 慢查詢日志里居然很多用了1秒的&#xff0c;Explain的結果是&am…

ARM的商業模式是如何煉成的?

導讀&#xff1a;保守、嚴謹&#xff0c;又有一些皇族氣質&#xff0c;作為一家擁有純正英國血統的公司&#xff0c;ARM看似呆板的作風卻讓其在移動互聯網大潮中勢如破竹&#xff0c;沒有對手。也許過于看重產業鏈伙伴的聲音&#xff0c;導致ARM的決策有些遲緩&#xff0c;比如…

java 將一段時間分割為兩個連續的時間

eg: 20180901 -- 20180930 ->>>> 20180901-20180915 && 20180916-20180930 /*** 獲取兩日期相差天數** param beginDateStr 時間起點* param endDateStr 時間終點* param TimeType 時間類型 yyyy-MM-dd || yyyyMMdd || ....* return long /天數*/public …

java 中 FtpClient 實現 FTP 文件上傳、下載

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 源代碼大部分是網上找的&#xff0c;查來查去&#xff0c;找到幾個可以用的例子&#xff0c;改來改去&#xff0c;揉合成現在這個樣子。…

MongDB集合文檔操作符

一、MongoDB - 連接1.啟動 MongoDB 服務只需要在 MongoDB 安裝目錄的 bin 目錄下執行 mongod 即可執行啟動操作后&#xff0c;mongodb 在輸出一些必要信息后不會輸出任何信息&#xff0c;之后就等待連接的建立&#xff0c;當連接被建立后&#xff0c;就會開始打印日志信息。可以…

LIMIT M,N分頁性能優化方案

利用子查詢優化 說明: MySQL 并不是跳過 offset 行&#xff0c;而是取 offsetN 行&#xff0c;然后返回放棄前 offset 行&#xff0c;返回 N 行&#xff0c;那當 offset 特別大的時候&#xff0c;此時使用limit m,n效率就非常的低下。想要提升性能要么控制返回的總頁數&#…

PHP獲取文件后綴名

PHP獲取文件后綴名是PHP學習者常見的一種操作&#xff0c;無論是在面試過程中還是PHP新手自學中。PHP獲取文件后綴名都是很普遍的需要掌握的一個知識點。下面我們就給大家總結介紹PHP獲取文件擴展名也就是后綴名的兩種方法&#xff01;一、通過pathinfo首先大家應該知道pathinf…

Web Service 簡單實例(java 版本) ,IDE自動生成客戶端代碼方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、客戶端工程 jar 包 &#xff1a; 二、1. 服務端&#xff1a;( new 一個web service project ) package com;import javax.jws.…

最佳Linux服務器發行版

一款Linux發行版就如同一件衣服一樣&#xff0c;適合自己的才是最好的選擇。 對大型企業而言&#xff0c;當然首選Red Hat Enterprise Linux&#xff08;RHEL&#xff09;。Red Hat有完善的技術支持服務&#xff0c;而且在我們周圍&#xff0c;非常容易找到持有Red Hat認證的技…