国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java Thread yield()方法的理解

frank_fun / 1986人閱讀

摘要:先看一下源碼是一個方法也就是說是或者實現(xiàn)的概念當(dāng)調(diào)用的時候,會給線程調(diào)度器一個當(dāng)前線程愿意出讓的使用的暗示,但是線程調(diào)度器可能會忽略這個暗示。

先看一下源碼 yield()是一個native方法也就是說是C或者C++實現(xiàn)的

  /**
     * 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();

概念: 當(dāng)調(diào)用Thread.yield()的時候,會給線程調(diào)度器一個當(dāng)前線程愿意出讓CPU的使用的暗示,但是線程調(diào)度器可能會忽略這個暗示。

代碼

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("當(dāng)前線程為: "+ 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();
    }
}

第一次執(zhí)行結(jié)果

當(dāng)前線程為: A0
當(dāng)前線程為: B0
當(dāng)前線程為: A1
當(dāng)前線程為: B1
當(dāng)前線程為: A2
當(dāng)前線程為: B2
當(dāng)前線程為: A3
當(dāng)前線程為: B3
當(dāng)前線程為: A4
當(dāng)前線程為: B4
當(dāng)前線程為: A5
當(dāng)前線程為: B5
當(dāng)前線程為: A6
當(dāng)前線程為: B6
當(dāng)前線程為: A7
當(dāng)前線程為: B7
當(dāng)前線程為: B8
當(dāng)前線程為: A8
當(dāng)前線程為: A9
當(dāng)前線程為: B9
第二次執(zhí)行結(jié)果

當(dāng)前線程為: B0
當(dāng)前線程為: B1
當(dāng)前線程為: B2
當(dāng)前線程為: B3
當(dāng)前線程為: B4
當(dāng)前線程為: B5
當(dāng)前線程為: B6
當(dāng)前線程為: B7
當(dāng)前線程為: B8
當(dāng)前線程為: B9
當(dāng)前線程為: A0
當(dāng)前線程為: A1
當(dāng)前線程為: A2
當(dāng)前線程為: A3
當(dāng)前線程為: A4
當(dāng)前線程為: A5
當(dāng)前線程為: A6
當(dāng)前線程為: A7
當(dāng)前線程為: A8
當(dāng)前線程為: A9
第三次執(zhí)行結(jié)果

當(dāng)前線程為: A0
當(dāng)前線程為: A1
當(dāng)前線程為: A2
當(dāng)前線程為: A3
當(dāng)前線程為: A4
當(dāng)前線程為: A5
當(dāng)前線程為: A6
當(dāng)前線程為: A7
當(dāng)前線程為: A8
當(dāng)前線程為: A9
當(dāng)前線程為: B0
當(dāng)前線程為: B1
當(dāng)前線程為: B2
當(dāng)前線程為: B3
當(dāng)前線程為: B4
當(dāng)前線程為: B5
當(dāng)前線程為: B6
當(dāng)前線程為: B7
當(dāng)前線程為: B8
當(dāng)前線程為: B9
第四次執(zhí)行結(jié)果

當(dāng)前線程為: A0
當(dāng)前線程為: A1
當(dāng)前線程為: A2
當(dāng)前線程為: A3
當(dāng)前線程為: A4
當(dāng)前線程為: A5
當(dāng)前線程為: A6
當(dāng)前線程為: A7
當(dāng)前線程為: A8
當(dāng)前線程為: A9
當(dāng)前線程為: B0
當(dāng)前線程為: B1
當(dāng)前線程為: B2
當(dāng)前線程為: B3
當(dāng)前線程為: B4
當(dāng)前線程為: B5
當(dāng)前線程為: B6
當(dāng)前線程為: B7
當(dāng)前線程為: B8
當(dāng)前線程為: B9
第五次執(zhí)行結(jié)果

當(dāng)前線程為: A0
當(dāng)前線程為: B0
當(dāng)前線程為: A1
當(dāng)前線程為: B1
當(dāng)前線程為: A2
當(dāng)前線程為: B2
當(dāng)前線程為: A3
當(dāng)前線程為: B3
當(dāng)前線程為: A4
當(dāng)前線程為: B4
當(dāng)前線程為: A5
當(dāng)前線程為: B5
當(dāng)前線程為: A6
當(dāng)前線程為: B6
當(dāng)前線程為: A7
當(dāng)前線程為: B7
當(dāng)前線程為: B8
當(dāng)前線程為: A8
當(dāng)前線程為: A9
當(dāng)前線程為: B9
說明每次執(zhí)行的可能都不一樣,但是當(dāng)執(zhí)行到i == 5時候當(dāng)前線程可能繼續(xù)執(zhí)行也可能讓B執(zhí)行。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/75063.html

相關(guān)文章

  • javathread.yield

    摘要:,看到很多文章把理解為暫停,其實是不準(zhǔn)確的,翻譯過來用讓步更為準(zhǔn)確一些。如下在中我們可以看到官方的解釋,更多的是作為調(diào)試或測試時候使用也就是瘋狂重分配,提高切換概率,模擬并發(fā) yield,看到很多文章把yield理解為暫停,其實是不準(zhǔn)確的,翻譯過來用讓步更為準(zhǔn)確一些。簡單描述下其作用: 使調(diào)用yield的正在執(zhí)行的線程讓出cpu,讓同等優(yōu)先權(quán)的其他線程包括自身重新進(jìn)行分配調(diào)度 概念性的...

    YPHP 評論0 收藏0
  • Java并發(fā)編程——線程基礎(chǔ)查漏補缺

    摘要:告訴當(dāng)前執(zhí)行的線程為線程池中其他具有相同優(yōu)先級的線程提供機(jī)會。不能保證會立即使當(dāng)前正在執(zhí)行的線程處于可運行狀態(tài)。當(dāng)達(dá)到超時時間時,主線程和是同樣可能的執(zhí)行者候選。下一篇并發(fā)編程線程安全性深層原因 Thread 使用Java的同學(xué)對Thread應(yīng)該不陌生了,線程的創(chuàng)建和啟動等這里就不講了,這篇主要講幾個容易被忽視的方法以及線程狀態(tài)遷移。 wait/notify/notifyAll 首先我...

    luqiuwen 評論0 收藏0
  • @Java | Thread & synchronized - [ 多線程 基本使用]

    摘要:線程線程是進(jìn)程中的一個實體,作為系統(tǒng)調(diào)度和分派的基本單位。下的線程看作輕量級進(jìn)程。因此,使用的目的是讓相同優(yōu)先級的線程之間能適當(dāng)?shù)妮嗈D(zhuǎn)執(zhí)行。需要注意的是,是線程自己從內(nèi)部拋出的,并不是方法拋出的。 本文及后續(xù)相關(guān)文章梳理一下關(guān)于多線程和同步鎖的知識,平時只是應(yīng)用層面的了解,由于最近面試總是問一些原理性的知識,雖說比較反感這種理論派,但是為了生計也必須掌握一番。(PS:并不是說掌握原理不...

    zhunjiee 評論0 收藏0
  • Thread類源碼解讀(2)——線程狀態(tài)及常用方法

    摘要:如果線程還存活,線程就無限期等待,并讓出監(jiān)視器鎖,進(jìn)入狀態(tài)。當(dāng)線程從狀態(tài)被喚醒后通過,或者是假喚醒將繼續(xù)競爭監(jiān)視器鎖,當(dāng)成功獲得監(jiān)視器鎖后,他將從調(diào)用的地方恢復(fù),繼續(xù)運行。 前言 系列文章目錄 上一篇我們討論了線程的創(chuàng)建,本篇我們來聊一聊線程的狀態(tài)轉(zhuǎn)換以及常用的幾個比較重要的方法。 本篇依然是通過源碼分析來了解這些知識。 本文源碼基于jdk1.8 。 閱讀完本文,你應(yīng)當(dāng)有能力回答以...

    luqiuwen 評論0 收藏0
  • Java多線程筆記(一):JMM與基礎(chǔ)關(guān)鍵字

    摘要:當(dāng)線程執(zhí)行完后進(jìn)入狀態(tài),表示線程執(zhí)行結(jié)束。其中和表示兩個線程。但要注意,讓出并不表示當(dāng)前線程不執(zhí)行了。關(guān)鍵字其作用是防止指令重排和使線程對一個對象的修改令其他線程可見。 JMM特性一覽 Java Memory Model的關(guān)鍵技術(shù)點都是圍繞著多線程的原子性、可見性和有序性來建立的。因此我們首先需要來了解這些概念。 原子性(Atomicity) 原子性是指一個操作是不可中斷的。即使是在多...

    cyixlq 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<