Java多線程3:Thread中的靜態方法


Thread類中的靜態方法

Thread類中的靜態方法表示操作的線程是"正在執行靜態方法所在的代碼塊的線程"。為什么Thread類中要有靜態方法,這樣就能對CPU當前正在運行的線程進行操作。下面來看一下Thread類中的靜態方法:

1、currentThread()

currentThread()方法返回的是對當前正在執行線程對象的引用。看一個重要的例子,然后得出結論:

看一下運行結果:

靜態塊的打印:main
構造方法的打印:main
run()方法的打印:Thread-0

這個例子說明了,線程類的構造方法、靜態塊是被main線程調用的,而線程類的run()方法才是應用線程自己調用的。在這個例子的基礎上,再深入:

 

上篇文章的開頭就說過,要理解一個重要的概念,就是"this.XXX()"和"Thread.currentThread().XXX()"的區別,這個就是最好的例子。必須要清楚的一點就是:當前執行的Thread未必就是Thread本身。從這個例子就能看出來:

(1)執行MyThread05構造方法是main,當前線程卻是Thread-0

(2)執行run()方法的Thread-0,當前線程也是Thread-0,說明run()方法就是被線程實例去執行的

所以,再強調一下,未必在MyThread05里調用Thread.currentThread()返回回來的線程對象的引用就是MyThread05

2、sleep(long millis)

sleep(long millis)方法的作用是在指定的毫秒內讓當前"正在執行的線程"休眠(暫停執行)。這個"正在執行的線程"是關鍵,指的是Thread.currentThread()返回的線程。根據JDK API的說法,"該線程不丟失任何監視器的所屬權",直白點講,就是不讓出CPU資源。CPU還在執行當前線程run()方法中的代碼,無非執行的內容是"睡覺"而已。看一下例子:

當然,因為打印結果是靜態的,所以只能看出異步執行的效果,看不出sleep(long millis)方法執行的效果。實際上第3句打出2秒后打出第4句,這和run()方法里面的sleep(2000)是對應的

3、yield()

暫停當前執行的線程對象,並執行其他線程。這個暫停是會放棄CPU資源的,並且放棄CPU的時間不確定,有可能剛放棄,就獲得CPU資源了,也有可能放棄好一會兒,才會被CPU執行。看一下例子:

public class MyThread08 extends Thread
{
    public void run()
    {
        long beginTime = System.currentTimeMillis();
        int count = 0;
        for (int i = 0; i < 50000000; i++)
        {
            Thread.yield();
            count = count + i + 1;
        }
        long endTime = System.currentTimeMillis();
        System.out.println("用時:" + (endTime - beginTime) + "毫秒!");
    }
}
public static void main(String[] args)
{
    MyThread08 mt = new MyThread08();
    mt.start();
}

看一下運行結果:

用時:3264毫秒!
用時:3299毫秒!
用時:3232毫秒!
用時:3256毫秒!
用時:3283毫秒!
用時:3504毫秒!
用時:3378毫秒!

看到,每次執行的用時都不一樣,證明了yield()方法放棄CPU的時間並不確定。

4、interrupted()

測試當前線程是否已經中斷,執行后具有將狀態標識清除為false的功能。換句話說,如果連續兩次調用該方法,那么返回的必定是false:

public static void main(String[] args)
{
    Thread.currentThread().interrupt();
    System.out.println("是否停止1?" + Thread.interrupted());
    System.out.println("是否停止2?" + Thread.interrupted());
    System.out.println("end!");
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM