天天看點

線程起名,分工有序 | 帶你學《Java語言進階特性》之六

上一篇:進一步探索多線程的實作 | 帶你學《Java語言進階特性》之五

【本節目标】

通過閱讀本節内容,你将學會通過線程命名實作對各個線程的準确控制,了解到線程的預設起名規則,并知曉main方法作為主線程處理總體邏輯,多個子線程分别處理各種複雜耗時的邏輯的開發模式。

多線程的主要方法都在Thread中定義了

線程的命名和取得

多線程的運作狀态是不确定的,那麼在程式的開發中為了可以擷取到一些需要使用的線程就隻能依靠線程名字來操作。是以線程的名字是一個至關重要的概念,這樣在Thread類之中就提供有線程名稱的處理。

  • 構造方法:public Thread(Runnable target,String name);
  • 設定名字:public final void setName(String name);
  • 取得名字:public final String getName();

對于線程對象的獲得是不可能隻是依靠一個this來完成的,因為線程的狀态不可控,但是有一點是明确的,所有的線程對象一定要執行run()方法,那麼這時候可以考慮擷取目前線程,在Thread類中有提供擷取目前線程的方法:

  • 擷取目前線程:public static Thread currentThread();

範例:觀察線程的命名操作

class MyThread implements Runnable {     //線程的主體類
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt = new MyThread();
        new Thread(mt, "線程A").start();   //設定了線程名字
        new Thread(mt).start();              //未設定線程名字
        new Thread(mt, "線程B").start();    //設定了線程名字
    }
}           
線程起名,分工有序 | 帶你學《Java語言進階特性》之六

圖一 線程命名

當開發者為線程設定名字的時候就使用設定的名字,而如果沒有設定名字,則會自動生成一個不重複的名字,這種自動屬性命名主要是依靠了static屬性完成的,在Thread類裡面定義有如下操作:

private static int threadInitNumber;
private static synchronized int nextThreadNum() {
    return threadInitNumber++;
}           

範例:觀察一個程式

class MyThread implements Runnable {      //線程的主體類
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt = new MyThread();
        new Thread(mt, "線程對象").start();     //設定了線程名字
        mt.run();        //對象直接調用run()方法
    }
}           
線程起名,分工有序 | 帶你學《Java語言進階特性》之六

圖二 設定線程名稱

通過此時的代碼可以發現當使用了“mt.run()”直接在主方法之中調用線程類對象的run()方法所獲得的的線程對象的名字為“main”,是以可以得出一個結論:主方法也是一個線程。那麼現在的問題來了,所有的線程都是在程序上的劃分那麼程序在哪裡?每當使用java指令執行程式的時候就表示啟動了一個JVM的程序,一台電腦上可以同時啟動若幹個JVM程序,是以每一個JVM程序都會有各自的線程。

線程起名,分工有序 | 帶你學《Java語言進階特性》之六

圖三 任務管理器程序

在任何的開發之中,主線程可以建立若幹個子線程,建立子線程的目的是可以将一些複雜邏輯或者比較耗時的邏輯交由子線程處理;

範例:子線程處理

public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        System.out.println("1、執行操作任務一。");
        new Thread(()->{           //子線程負責統計
            int temp=0;
            for(int x=0; x<Integer.MAX_VALUE; x++){
                temp+=x;
            }
        }).start();
        System.out.println("2、執行操作任務二。");
        System.out.println("n、執行操作任務N。");
    }
}           
線程起名,分工有序 | 帶你學《Java語言進階特性》之六

圖四 子線程處理

主線程負責處理整體流程控制,而子線程負責處理耗時操作。

想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。

本内容視訊來源于

阿裡雲大學 下一篇:教你随心操控線程狀态 | 帶你學《Java語言進階特性》之七 更多Java面向對象程式設計文章檢視此處