2015-04-23 96 views
2

這裏是一個多線程的HelloWorld:受Thread.yield()影響的線程?

public class HelloWorld { 

    public static void main(String[] args) throws InterruptedException { 
     Thread myThread = new Thread() { 
      public void run() { 
       System.out.println("Hello World from new thread"); 
      } 
     }; 
     myThread.start(); 
     Thread.yield(); 
     System.out.println("Hello from main thread"); 
     myThread.join(); 
    } 
} 

據我瞭解,在myThread.start()後,會出現運行兩個線程。一個是主線程,另一個是新創建的myThread。那麼,哪個線程在Thread.yield()中被引用?

我查了Java SE6文件,它說

Thread.yield():使當前執行的線程對象 暫時暫停並允許其它線程執行

但在代碼,我無法清楚地看到currently excuting thread是什麼,看起來兩個線程都在同一時間運行

難道說myThread.yield()而不是Thread.yield()更清楚嗎?有沒有人有關於此的想法?

+0

在你的情況下,'Thread.yield'將產生 「主」 線程在'main'運行 – MadProgrammer

+0

另見: http://stackoverflow.com/questions/ 1600572/are-thread-sleep0-and-thread-yield-statements-equivalent- –

回答

5

由於在這種情況下「當前線程」的Javadoc意味着

在你的情況「調用該方法Thread.yield()線程」,這是啓動應用程序的主線程。

正如Javadoc解釋的那樣,通常不需要撥打Thread.yield()。它不需要做任何事情:

一個提示當前線程願意得到 其目前使用的處理器的調度。調度程序可以自由地忽略這個 提示。

它似乎做了一些事情,至少到Java 6 - 找不到Java 7/8的參考。

的Windows:

的HotSpot虛擬機現在使用Windows SwitchToThread() API調用實現Thread.yield()。此調用使當前線程放棄當前時間片 ,但不是其全部量子。

的Linux:

在Linux下,熱點只是調用sched_yield()。這個呼叫的後果是 有點不同,並且可能比在Windows下的 更嚴重。

來源:http://www.javamex.com/tutorials/threads/yield.shtml

+0

不只是這個問題。當幾乎_any_方法的文檔中出現「當前線程」時,它表示「調用該方法的線程」。 –

0

主線程將受到影響。 您始終可以使用Thread.currentThread().getName()來獲取當前的線程名稱。 你也可以做

Thread.currentThread().yield() 

其他線程運行的run方法,直到它完成,比出口。

+1

它被稱爲'currentThread()'(帶't'而不是'd'),它是一個函數 - 不是字段 - 所以你應該在其後面加上括號'()'來調用函數。 –

4

當前線程受到影響,即調用該方法的線程。

是不是應該更明確地說myThread.yield()而不是Thread.yield()?有沒有人有關於此的想法?

不,它不是。這是一個靜態方法,並且它是很好的規定。在這種情況下,它也會表達與實際發生的情況相反的情況。

但它也毫無意義。 yield()函數自從Windows 98的16位部分以來沒有做過任何有用的工作。無論如何,您的線程將被重新調度,因爲調度程序認爲合適。