Java多線程學習(二)——Thread一些方法

本文章首發微信公衆號:IT筆記分享java

歡迎掃碼關注我 😊 bash

image

Thread類的一些方法介紹

一、currentThread()方法

currentThread()方法能夠返回代碼被那個線程調用的信息。微信

測試方法以下:ide

public class MyThread extends Thread{
    public MyThread(){
        super();
    }
    public MyThread(String name){
        super();
        this.setName(name);
        System.out.println("構造器中線程名字:" + Thread.currentThread().getName());
    }

    @Override
    public void run() {
        super.run();
        System.out.println("this is MyThread");
        System.out.println("run方法中線程名字:" + Thread.currentThread().getName());
    }


    public static void main(String[] args){

        // 繼承Thread
        MyThread myThread = new MyThread("myThread-name");
        myThread.start();
    }
}
複製代碼

輸出內容:測試

構造器中線程名字:main
this is MyThread
run方法中線程名字:myThread-name
複製代碼

二、isAlive()方法

判斷當前線程是否處於活躍狀態,活躍狀態是指線程已經啓動而且還沒有終止。this

測試代碼:spa

public class IsAliveFunc extends Thread {

    @Override
    public void run() {
        super.run();
        System.out.println("run is alive = " + this.isAlive());
    }


    public static void main(String[] args){
        IsAliveFunc isAliveFunc = new IsAliveFunc();
        System.out.println("begin start " + isAliveFunc.isAlive());
        isAliveFunc.start();
        System.out.println("after start " + isAliveFunc.isAlive());
    }

}
複製代碼

輸出結果:操作系統

begin start false
after start true
run is alive = true
複製代碼

三、sleep()方法

sleep()方法是讓正在運行的線程在指定毫秒數內暫停。線程

測試代碼:code

public class SleepFunc {

    public static void sleep(){
        System.out.println("begin");
        try {
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("end");
    }

    public static void main(String[] args){
        System.out.println(" begin time = " + System.currentTimeMillis());
        sleep();
        System.out.println(" end time = " + System.currentTimeMillis());
    }
}
複製代碼

輸出結果:

begin time = 1551138333348
begin
end
end time = 1551138335348
複製代碼

能夠看出時間相差2秒。

四、getId()方法

獲取線程的惟一標識。

五、中止線程

中止線程意味着在線程處理完任務以前停掉正在作的操做,也就是放棄當前操做。有如下三種方法終止正在運行中的線程:

  1. 使用退出標誌,使線程正常退出,就是當run方法完成後終止線程;
  2. 使用stop方法錢箱終止線程,可是不推薦,由於stop和suspend及resume同樣是過時做廢方法;
  3. 使用interrupt中斷線程。

5.1 interrupt方法

interrupt()方法的使用並不像for+break語句那樣,立刻就中止循環。調用interrupt()方法僅僅是在當前線程中打了一箇中止的標記,並非真的中止線程。因此引出this.interrupted()和this.isInterrupted()方法。

  1. this.interrupted()是判斷當前線程是否已是中斷狀態,執行此方法後具備將線程的中斷狀態標誌清除爲false的功能;
  2. this.isInterrupted()是判斷當前線程是否已是中斷狀態,可是不清除狀態標誌。

因此使用interrupt()時須要判斷線程是否有中斷標誌,在使用return或者拋異常的方式中斷此線程。

5.2 stop()方法

stop方法是暴力中止線程,已經棄用的方法不建議使用。並且使用可能會拋出java.lang.ThreadDeath異常。若是強制讓線程中止則可能使一些清理性的工做的不能完成。另外一種狀況就是對鎖定的對象解鎖,出現數據不一致的狀況。

5.3 暫停線程

暫停線程可使用suspend()方法,使用resume()方法恢復。可是這兩個方法都是被廢棄的方法,不建議使用。這兩個方法若是使用不當會形成同步對象的獨佔,是其餘線程沒法訪問公共同步對象;也有可能產生數據不一樣步的狀況。

因此建議使用wait()方法暫停線程,使用notify()或者notifyAll()方法喚醒線程,這兩種方法會在線程後面的文章線程通訊部分講解。

六、yield()方法

yield()方法的做用的是放棄當前的CPU資源,將他讓給其餘的任務去佔用CPU執行時間,但放棄的時間不肯定,有可能剛剛放棄,立刻又得到CPU時間片。

七、線程的優先級

在操做系統中,線程能夠劃分優先級,優先級高的線程獲得的CPU資源較多,也就是說CPU優先執行優先級高的線程。線程的優先級具備繼承性,好比A線程啓動B線程,則B線程的優先級與A線程的同樣。

修改優先級的方法是setPriority()。

優先級高的線程老是大部分先執行,但不表明優先級高的線程所有先執行。線程優先級還具備「隨機性」,也就是優先級高的線程不必定每次都先執行。

八、守護線程

在Java線程中有兩種線程,一種是用戶線程,另外一種就是守護線程。守護線程具備陪伴的含義,當進程中不存在非守護線程了,則守護線程自動銷燬。典型的守護線程就是垃圾回收線程。能夠經過調用Thead類的setDaemon(true)方法設置當前的線程爲守護線程。

注意事項:

  1. setDaemon(true)必須在start()方法前執行,不然會拋出IllegalThreadStateException異常;
  2. 在守護線程中產生的新線程也是守護線程 3. 不是全部的任務均可以分配給守護線程來執行,好比讀寫操做或者計算邏輯。
public class DaemonThread extends Thread {

    private int i = 0;

    @Override
    public void run() {
        super.run();
        try {
            while (true){
                i++;
                System.out.println("i = " + i);
                Thread.sleep(1000);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


public class DaemonThread extends Thread {

    private int i = 0;

    @Override
    public void run() {
        super.run();
        try {
            while (true){
                i++;
                System.out.println("i = " + i);
                Thread.sleep(1000);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
複製代碼

輸出結果:

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
我離開thread對象也再也不打印了,也就是中止了!
複製代碼
相關文章
相關標籤/搜索