線程學習筆記(一)

創建線程的第一種方式:繼承Therad,重寫Thread的run方法,調用start方法啓動

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(i);
        }
    }

    public static void main(String[] args) {
        //主線程的
        MyThread myThread = new MyThread();
        //還是主線程幫你調用,使該線程開始執行;Java 虛擬機調用該線程的 run 方法。
        //如果調用run()那麼還是在主線程上執行
        myThread.start();
        //如果要在執行一次,那麼就得在新建對象執行,不能重複執行start(),不然會報錯
        //MyThread myThread1 = new MyThread();
        //myThread1.start();
        //主線程的
        for (int i = 0; i < 100; i++) {
            System.out.println(i + "main");
        }
    }
}

結果:

0main
1main
2main
3main
4main
......

也可以不使用繼承,創建Thread類對的匿名子類的方式,以及yield認識

public static void main(String[] args) {

        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    System.out.println(getPriority() + "=" + i);
                    if (i == 20) {
                        yield();
                    }
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run() {
                setPriority(10);
                for (int i = 0; i < 100; i++) {
                    System.out.println(getPriority() + "=" + i);
                }
            }
        }.start();
}

上面這個結果:你以爲第一個線程到20的時候會讓另一個線程運行,實際上不一定,以下是我測試的某次結果,會發現到20都沒開始避讓。

5=19
5=20
5=21
5=22
10=0
10=1
10=2

關於yield方法,參考:https://www.cnblogs.com/java-spring/p/8309931.html

Java線程中的Thread.yield( )方法,譯爲線程讓步。顧名思義,就是說當一個線程使用了這個方法之後,它就會把自己CPU執行的時間讓掉,
讓自己或者其它的線程運行,注意是讓自己或者其他線程運行,並不是單純的讓給其他線程。
        yield()的作用是讓步。它能讓當前線程由“運行狀態”進入到“就緒狀態”,從而讓其它具有相同優先級的等待線程獲取執行權;但是,並不能保
證在當前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是當前線程又進入到“運行狀態”繼續運行!
      舉個例子:一幫朋友在排隊上公交車,輪到Yield的時候,他突然說:我不想先上去了,咱們大家來競賽上公交車。然後所有人就一塊衝向公交車,
有可能是其他人先上車了,也有可能是Yield先上車了。
     但是線程是有優先級的,優先級越高的人,就一定能第一個上車嗎?這是不一定的,優先級高的人僅僅只是第一個上車的概率大了一點而已,
     最終第一個上車的,也有可能是優先級最低的人。並且所謂的優先級執行,是在大量執行次數中才能體現出來的。

Thread常用方法

start():使該線程開始執行;Java 虛擬機調用該線程的 run 方法

run():要在新線程種執行的方法

currentThread():靜態方法,返回對當前正在執行的線程對象的引用

getName():獲取當前線程名字

setName():設置當前線程名字

 

面試官:請問啓動線程是start()還是run()方法,能談談嗎?
應聘者:start()方法
當用start()開始一個線程後,線程就進入就緒狀態,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。但是這並不意味着線程就會立即運行。只有當cpu分配時間片時,這個線程獲得時間片時,纔開始執行run()方法。start()是方法,它調用run()方法.而run()方法是你必須重寫的. run()方法中包含的是線程的主體(真正的邏輯)。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章