Thread類解析

Thread線程類API

聲明本文使用的是JDK1.8java

實現多線程從本質上都是由Thread類來進行操做的~咱們來看看Thread類一些重要的知識點。Thread這個類很大,不可能整個把它看下來,只能看一些常見的、重要的方法。數據庫

1.1設置線程名安全

 

咱們在使用多線程的時候,想要查看線程名是很簡單的,調用Thread.currentThread().getName()便可。多線程

 

若是沒有作什麼的設置,咱們會發現線程的名字是這樣子的:主線程叫作main,其餘線程是Thread-xide

線程中nextThreadNum()方法實現爲咱們線程命名,若是咱們想要爲線程起個名字,那也是很簡單的。Thread給咱們提供了構造方法!spa

public class MyThread implements Runnable {
    @Override
    public void run() {
		// 打印出當前線程的名字
        System.out.println(Thread.currentThread().getName());
    }
}


public class MyThreadDemo {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //帶參構造方法給線程起名字
        Thread thread1 = new Thread(myThread, "harpoonJava");
        Thread thread2 = new Thread(myThread, "harpoon");
        thread1.start();
        thread2.start();
		
		// 打印當前線程的名字
        System.out.println(Thread.currentThread().getName());
    }
} 

結果:操作系統

main
harpoonJava
harpoon

固然了,咱們還能夠經過setName(String name)的方法來改掉線程的名字的。線程

 

1.2守護線程設計

 

守護線程是爲其餘線程服務的對象

  • 垃圾回收線程就是守護線程~

守護線程有一個特色:

  • 當別的用戶線程執行完了,虛擬機就會退出,守護線程也就會被中止掉了。
  • 也就是說:守護線程做爲一個服務線程,沒有服務對象就沒有必要繼續運行了

使用線程的時候要注意的地方:

  1. 在線程啓動前設置爲守護線程,方法是setDaemon(boolean on)
  2. 使用守護線程不要訪問共享資源(數據庫、文件等),由於它可能會在任什麼時候候就掛掉了。
  3. 守護線程中產生的新線程也是守護線程

 

1.3優先級線程

 

線程優先級高僅僅表示線程獲取的CPU時間片的概率高,但這不是一個肯定的因素!

 

線程的優先級是高度依賴於操做系統的Windows和Linux就有所區別(Linux下優先級可能就被忽略了)~

 

Java提供的優先級默認是5,最低是1,最高是10。

setPriority0是一個本地(navite)的方法:

private native void setPriority0(int newPriority);

 

1.4線程生命週期

 

在上一篇介紹的時候其實也提過了線程的線程有3個基本狀態:執行、就緒、阻塞

 

Thread上不少的方法都是用來切換線程的狀態的,這一部分是重點!

 

1.4.1sleep方法

 

調用sleep方法會進入計時等待狀態,等時間到了,進入的是就緒狀態而並不是是運行狀態!

1.4.2yield方法

 

調用yield方法會先讓別的線程執行,可是不確保真正讓出

 

  • 意思是:我有空,能夠的話,讓大家先執行

 

1.4.3join方法

 

調用join方法,會等待該線程執行完畢後才執行別的線程~

 

1.4.3interrupt方法

 

線程中斷在以前的版本有stop方法,可是被設置過期了。如今已經沒有強制線程終止的方法了!

 

因爲stop方法可讓一個線程A終止掉另外一個線程B

  • 被終止的線程B會當即釋放鎖,這可能會讓對象處於不一致的狀態。
  • 線程A也不知道線程B何時可以被終止掉,萬一線程B還處理運行計算階段,線程A調用stop方法將線程B終止,那就很無辜了~總而言之,Stop方法太暴力了,不安全,因此被設置過期了。咱們通常使用的是interrupt來請求終止線程~
  • 要注意的是:interrupt不會真正中止一個線程,它僅僅是給這個線程發了一個信號告訴它,它應該要結束了(明白這一點很是重要!)
  • 也就是說:Java設計者其實是想線程本身來終止,經過上面的信號,就能夠判斷處理什麼業務了。
  • 具體到底中斷仍是繼續運行,應該由被通知的線程本身處理

再次說明:調用interrupt()並非要真正終止掉當前線程,僅僅是設置了一箇中斷標誌。這個中斷標誌能夠給咱們用來判斷何時該幹什麼活!何時中斷由咱們本身來決定,這樣就能夠安全地終止線程了!

interrupt方法壓根是不會對線程的狀態形成影響的,它僅僅設置一個標誌位罷了

interrupt線程中斷還有另外兩個方法(檢查該線程是否被中斷):

  • 靜態方法interrupted()-->會清除中斷標誌位
  • 實例方法isInterrupted()-->不會清除中斷標誌位

若是阻塞線程調用了interrupt()方法,那麼會拋出異常,設置標誌位爲false,同時該線程會退出阻塞的。

相關文章
相關標籤/搜索