1. 程式人生 > >執行緒睡眠sleep()方法和執行緒讓步yield()方法的主要區別

執行緒睡眠sleep()方法和執行緒讓步yield()方法的主要區別



import java.util.*;
public class SleepTest
{
 public static void main(String[] args) throws Exception
 {
  for (int i=0; i<10; i++)
  {
   System.out.println("當前時間:" + new Date());
   //呼叫sleep()方法讓當前執行緒暫停2s
   Thread.sleep(2000);
  }
 }
}

執行結果:

D:\mytest\Thread>javac SleepTest.java

D:\mytest\Thread>java SleepTest
當前時間:Mon Mar 24 12:36:02 CST 2014
當前時間:Mon Mar 24 12:36:04 CST 2014
當前時間:Mon Mar 24 12:36:06 CST 2014
當前時間:Mon Mar 24 12:36:08 CST 2014
當前時間:Mon Mar 24 12:36:10 CST 2014
當前時間:Mon Mar 24 12:36:12 CST 2014
當前時間:Mon Mar 24 12:36:14 CST 2014
當前時間:Mon Mar 24 12:36:16 CST 2014
當前時間:Mon Mar 24 12:36:18 CST 2014
當前時間:Mon Mar 24 12:36:20 CST 2014

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<=40;i++){
      System.out.println(getName()+": "+i);
      if(i%10==0){
        yield();
      }
    }
  }
}

執行結果:


D:\mytest\Thread>javac TestYield.java

D:\mytest\Thread>java TestYield
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
t1: 10
t2: 1
t2: 2
t2: 3
t2: 4
t2: 5
t2: 6
t2: 7
t2: 8
t2: 9
t2: 10
t1: 11
t1: 12
t1: 13
t1: 14
t1: 15
t1: 16
t1: 17
t1: 18
t1: 19
t1: 20
t1: 21
t1: 22
t1: 23
t1: 24
t1: 25
t1: 26
t1: 27
t1: 28
t1: 29
t1: 30
t1: 31
t1: 32
t1: 33
t1: 34
t1: 35
t1: 36
t1: 37
t1: 38
t1: 39
t1: 40
t2: 11
t2: 12
t2: 13
t2: 14
t2: 15
t2: 16
t2: 17
t2: 18
t2: 19
t2: 20
t2: 21
t2: 22
t2: 23
t2: 24
t2: 25
t2: 26
t2: 27
t2: 28
t2: 29
t2: 30
t2: 31
t2: 32
t2: 33
t2: 34
t2: 35
t2: 36
t2: 37
t2: 38
t2: 39
t2: 40
關於sleep()方法和yield()方法的區別如下:

1.sleep()方法暫停當前執行緒後,會給其他執行緒執行機會,不會理會其他執行緒的優先順序;但yield()方法只會給優先順序相同,或優先順序更高的執行緒執行機會。

2.sleep()方法會將執行緒轉入阻塞狀態,直到經過阻塞時間才會轉入就緒狀態;而yield()方法不會將執行緒轉入阻塞狀態,它只是強制當前執行緒進入就緒狀態。因此完全有可能某個執行緒呼叫yield()方法暫停之後,立即再次獲得處理器資源被執行。

3.sleep()方法宣告丟擲了InterruptedException異常,所以呼叫sleep()方法時要麼捕捉該異常,要麼顯式宣告丟擲該異常;而yield()方法則沒有宣告丟擲任何異常。

4.sleep()方法比yield()方法有更好的可移植性,通常不建議使用yield()方法來控制併發執行緒的執行。

相關推薦

執行睡眠sleep()方法執行讓步yield()方法主要區別

 import java.util.*; public class SleepTest {  public static void main(String[] args) throws Exception  {   for (int i=0; i<10; i++)

java中執行睡眠sleep()方法介紹

1、方法介紹    sleep(long millis)  執行緒睡眠 millis 毫秒    sleep(long millis, int nanos)  執行緒睡眠 millis 毫秒 + nanos 納秒2、如何呼叫sleep    因為sleep()是靜態方法,所以

執行sleep,wait,join,yield方法區別

原文地址:http://dylanxu.iteye.com/blog/1322066 1、sleep() 使當前執行緒(即呼叫該方法的執行緒)暫停執行一段時間,讓其他執行緒有機會繼續執行,但它並不釋放物件鎖。也就是說如果有synchronized同步

JAVA的interrupt()方法執行終止的方式

1 // Demo3.java的原始碼 2 class MyThread extends Thread { 3 4 private volatile boolean flag= true; 5 public void stopTask() { 6 flag =

Thread類的sleep()方法對象的wait()方法都可以讓線程暫停執行,它們有什麽區別? 線程的sleep()方法yield()方法有什麽區別

阻塞 可移植性 喚醒 ora 暫停 obj 狀態 ati 對象 Thread類的sleep()方法和對象的wait()方法都可以讓線程暫停執行,它們有什麽區別?   sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執

java多執行:1程序執行

多執行緒樣例 我們用工人卸貨舉例:有一集裝箱的貨物等待卸車,共100個箱子,一個工人一次只能搬一個箱子。 如果只有一個工人,那麼該工人需要搬運100次,而且是不停歇的搬運。 如果有5個或者10個工人,那麼平均每個工人只需要搬運20或者10次就可以了。 甚至有1

(四)多執行說學逗唱:執行險惡,變數執行安全不得不防

(一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 (三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable) 出了新手村,以後的路可就不那麼好走了,到底現在也是個江湖人,都必須經歷點困難挫折,要不以後拿什

執行中總記憶體執行的工作記憶體

Java記憶體模型將記憶體分為了 主記憶體和工作記憶體 。類的狀態,也就是類之間共享的變數,是儲存在主記憶體中的,每個執行緒都有一個自己的工作記憶體(相當於CPU高階緩衝區,這麼做的目的還是在於進一步縮小儲存系統與CPU之間速度的差異,提高效能),每次Java

java虛擬機器學習之執行共享記憶體區執行私有區

 執行緒共享指的就是可以允許被所有執行緒共享訪問的一塊記憶體,包括堆區,方法區和執行時常量池。  1. java堆區      java堆區在虛擬機器啟動時被建立,並且他在實際記憶體中是可以不連續的。

Java多執行之建立任務執行

Runnable建立執行緒 任務就是物件。為了建立任務,必須首先為任務定義一個類。任務類必須實現Runnable介面。Runnable介面非常簡單,它只包含一個run方法。需要實現這個方法來告訴系統執行緒將如何執行。開發一個任務類的模板如圖29-2a所示。

VC++多執行程式設計-執行間的通訊執行同步

執行緒間通訊   一般而言,應用程式中的一個次要執行緒總是為主執行緒執行特定的任務,這樣,主執行緒和次要執行緒間必定有一個資訊傳遞的渠道,也就是主執行緒和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。

iOS多執行中,佇列執行的排列組合結果分析

本文是對以往學習的多執行緒中知識點的一個整理。 多執行緒中的佇列有:序列佇列,併發佇列,全域性佇列,主佇列。 執行的方法有:同步執行和非同步執行。那麼兩兩一組合會有哪些注意事項呢? 如果不是在董鉑然部落格園看到這邊文章請 點選檢視原文 提到多執行緒,也就是四種,pthread,NSthread,GCD

Android.執行池的原理執行池管理類的使用

執行緒池的原理 執行緒池使用來管理執行緒的,之所以稱為池,是因為其可以管理多條執行緒,所以需要用一個集合來管理執行緒,然後執行緒池是有大小的,當一個執行緒池管理的執行緒數目為計算機的cup數*2+1個

同一個程序中的執行共享的資源執行獨享的資源

執行緒共享的環境包括:程序程式碼段、程序的公有資料(利用這些共享的資料,執行緒很容易的實現相互之間的通訊)、程序開啟的檔案描述符、訊號的處理器、程序的當前目錄和程序使用者ID與程序組ID。 程序擁有這許多共性的同時,還擁有自己的個性。有了這些個性,執行緒才

學習筆記之執行、Thread類執行終止相關整理(下)——執行異常&JVM停止

提到執行緒的中斷在某些情況下會丟擲InterruptedException異常,最終導致執行緒的終止。其實,執行緒也有可能由於其他異常原因造成終止,在某些情況下為了做一些妥善的處理,我們需要捕獲這些異常情況。看下面程式碼,覺得會怎樣? 1 2 3 4 5

執行安全的HashMap 執行安全的ConcurrentHashMap

在平時開發中,我們經常採用HashMap來作為本地快取的一種實現方式,將一些如系統變數等資料量比較少的引數儲存在HashMap中,並將其作 為單例類的一個屬性。在系統執行中,使用到這些快取資料,都可以直接從該單例中獲取該屬性集合。但是,最近發現,HashMap並不是執行緒

boost中asio網路庫多執行併發處理實現,以及asio在多執行模型中執行的排程情況執行安全。

1、實現多執行緒方法: 其實就是多個執行緒同時呼叫io_service::run         for (int i = 0; i != m_nThreads; ++i)         {             boost::shared_ptr<boost::

10-多執行、多程序執行池程式設計

一、多執行緒、多程序和執行緒池程式設計 1.1、Python中的GIL鎖   CPython中,global interpreter lock(簡稱GIL)是一個互斥體,用於保護對Python物件的訪問,從而防止多個執行緒一次執行Python位元組碼(也就是說,GIL鎖每次只能允許一個執行緒工作,無法多個執行

cmd命令列執行java程式的編譯執行方法及可能出現找不到或無法載入主類的錯誤的解決

首先我們經常在用cmd命令列編譯和執行java程式時,我們的java程式呼叫了第三方的jar包,那麼編譯和執行的方法有兩種: 方法1: 編譯:javac -Djava.ext.dirs=E:\

java.lang.Thread.sleep()方法java.lang.Object.wait()方法之間的區別

java.lang.Thread.sleep(): sleep()方法為Thread類定義的靜態方法,因此需要通過Thread類呼叫該方法: Thread.sleep(1000); Javadoc對該方法的描述如下: Causes the currently executi