天天看點

看懂java線程,了解并行、并發一篇就夠了

文章目錄

  • ​​1 🚩基本概念​​
  • ​​2 🚩線程的基本使用​​
  • ​​2.1 線程的使用方式1 繼承Thread類,重寫run方法​​
  • ​​2.2 線程的使用方式2 實作Runnable接口,重寫run方法​​
  • ​​2.3 終止線程​​
  • ​​3 🚩線程常用的方法​​
  • ​​4 🚩使用者線程和守護線程:​​
  • ​​5 🌰使用者線程與守護線程代碼示例​​
  • ​​6 🚩線程的生命周期​​
  • ​​7 🚩線程同步​​
  • ​​7.1 同步的實作步驟​​
  • ​​7.2 釋放鎖​​
  • ​​結語​​

📖

個人介紹

大家好我是:一顆松

認真分享技術,記錄學習點滴

如果分享對你有用請支援我哦🍺

個人格言: 想法落實的最佳時機就是現在!🏄

1 🚩基本概念

程式(program):就是我們寫的代碼;

程序:運作的程式;是程式的一次執行過程,存在有産生、存在、消亡等;

線程:由程序建立,是程序的一個實體;

單線程:同一時刻隻允許執行一個線程:

多線程:同一時刻允許執行多個線程;如用下載下傳軟體可同時下載下傳多個資源

并發:同一時刻多個任務交替執行,單核CPU執行多任務就是并發;

并行:同一時刻,執行多個任務,多核CPU執行多個任務;

2 🚩線程的基本使用

在java中線程使用有兩種方法,分别是

①繼承Thread的類,重寫run方法;

②實作Runnable接口,重寫run方法;

2.1 線程的使用方式1 繼承Thread類,重寫run方法

2.2 線程的使用方式2 實作Runnable接口,重寫run方法

兩種方法的使用示例:

public class TestRunnable2 {
    public static void main(String[] args) {
//        建立PrintHello對象
        PrintHello pho = new PrintHello();
//        建立PrintHai對象
        PrintHai ph = new PrintHai();
//        繼承Thread類對象啟動線程
        pho.start();
//        實作Runnable接口類對象,啟動線程
        Thread td = new Thread(ph);
        td.start();
    }
}
//PrintHai類實作Runnable接口
class PrintHai implements Runnable{
//    重寫run方法
    @Override
    public void run() {
//        在run方法内寫需要執行的代碼
        int count = 0;
        while (true){
            System.out.println("HiHi"+Thread.currentThread().getName()+"計數:"+count);
            count++;
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count==10)break;
        }
    }
}
//PrintHello 繼承Thread類
class PrintHello extends Thread{
//重寫run方法
    @Override
    public void run() {
//        在run方法中寫執行的代碼
        int count = 0;
        while (true){
            System.out.println("hello"+Thread.currentThread().getName()+"計數:"+count);
            count++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (count==60)break;
        }
    }
}      

2.3 終止線程

(1) 線程完成任務以後自動退出

(2)通過變量來控制run方法退出,進而控制線程

3 🚩線程常用的方法

方法名 說明
setName 設定線程名稱,使之與參數名相同
getName 傳回線程名
start 開啟線程,JVM調用該線程start0方法
run 調用線程對象run方法
setPriority 更改線程優先級
getPriority 擷取該線程優先級
sleep 指定毫秒數讓目前正在執行的線程休眠
interruput 中斷線程

常用方法2

yield方法,禮讓但不一定成功;

join方法,插隊,一旦插隊成功必先執行完所有插隊任務再

4 🚩使用者線程和守護線程:

使用者線程:也叫工作線程,當線程任務執行完畢或收到通知才結束;

守護線程:一般為工作線程服務,當所有使用者線程結束,守護線程自動結束;

常見的守護線程:垃圾回收機制;

5 🌰使用者線程與守護線程代碼示例

class MainTest2{
    public static void main(String[] args) throws InterruptedException {
        MyDeamon txc = new MyDeamon();
        Thread td = new Thread(txc);
//        将線程設計為守護線程;當所有使用者線程結束後,守護線程自動結束
        td.setDaemon(true);
//        啟動子線程
        td.start();
//        設定主線程
        for (int i = 0; i < 6; i++) {
            System.out.println("主線程" + Thread.currentThread().getName() + "執行了" + i + "次");
//            if (i == 5){
//                td.join();
//            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//子線程
 class MyDeamon implements Runnable{
    @Override
    public void run() {
        int count = 0;
        while (true) {
            System.out.println("子線程" + Thread.currentThread().getName() + "執行了" + count + "次");
            count++;
            try {
                Thread.sleep(1000);
                if (count == 20)break;
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
      

6 🚩線程的生命周期

線程有六種存在狀态:

看懂java線程,了解并行、并發一篇就夠了
  • 線程狀态。線程可以處于以下狀态之一:
  • ​​NEW​​尚未啟動的線程處于此狀态。
  • ​​RUNNABLE​​在Java虛拟機中執行的線程處于此狀态。
  • ​​BLOCKED​​被阻塞等待螢幕鎖定的線程處于此狀态。
  • ​​WAITING​​無限期等待另一個線程執行特定操作的線程處于此狀态。
  • ​​TIMED_WAITING​​正在等待另一個線程執行最多指定等待時間的操作的線程處于此狀态。
  • ​​TERMINATED​​已退出的線程處于此狀态。

7 🚩線程同步

線程同步機制:

保證在同一時刻資料最多允許,隻有一個線程通路,保證資料的完整性;

7.1 同步的實作步驟

使用Synchronized(互斥鎖)

(1)同步代碼塊

//得到對象的鎖才能操作,同步同步代碼塊

synchronized(對象){

//同步代碼塊

}

(2)放在方法聲明中,表示整個方法為同步方法;

7.2 釋放鎖

釋放鎖的條件:

(1) 當線程的同步方法,同步代碼塊執行結束;

(2)目前線程在同步代碼塊、同步方法中遇到break、return會

(3)目前線程在同步代碼塊、同步方法中出現了未處理的Error、Exception;

(4)目前線程在同步代碼塊、同步方法中執行了線程對象的wait方法,目前線程暫停并釋放鎖;

不會釋放鎖的幾種情況;

(1)線程在執行同步代碼塊同步方法時,程式調用了Thread.sleep()、Thread.yield()方法,暫停目前線程執行,但是不會釋放鎖;

(2)線程執行同步代碼塊時,其他線程調用了目前線程的suspend()方法将該線程挂起,該線程不會釋放鎖;

結語

大佬請留步
看懂java線程,了解并行、并發一篇就夠了