JAVA_基礎多執行緒(一)

多執行緒

多執行緒的創建方式一
一、創建一個繼承於Thread類的子類
二、重寫Thread類的run() 將此執行緒執行的操作聲明在run()中
三、創建Thread類的子類的對象
4. 通過此對象調用start()

  • 啟動當前執行緒
  • 調用當前執行緒的run()
    問題一:我們不能直接調用run()的方式啟動執行緒。(直接調用,則是在mian()主執行緒運行的)
public class ThreadDemo {
    public static void main(String[] args) {
        //③創建Thread類的子類的對象
        MyThread1 m1 = new MyThread1();
        MyThread2 m2 = new MyThread2();
        //方法一:④通過此對象調用start()
        m1.start();
        m2.start();
        //方法二:④創建Thread類的匿名子類的方式
        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {a
                    if (i % 2 == 0) {
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }.start();
        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if (i % 2 != 0 ) {
                        System.out.println(Thread.currentThread().getName() + ":" + i);
                    }
                }
            }
        }.start();
    }
}
//①創建一個繼承於Thread類的子類
class MyThread1 extends Thread {
    //②重寫Thread類的run() 將此執行緒執行的操作聲明在run()中
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0 ) {
                System.out.println(Thread.currentThread().getName() + ":" +i);
            }
        }
    }
}
//①創建一個繼承於Thread類的子類
class MyThread2 extends Thread {
    //②重寫Thread類的run() 將此執行緒執行的操作聲明在run()中
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (i % 2 != 0 ) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            }
        }
    }
}

測試Thread中的常用方法

start():啟動當前執行緒,調用當前執行緒的run()方法。
run():通常需要重寫Thread類中的此方法,將創建的執行緒要執行的操作聲明在此方法中。
currentThread():靜態方法,返回當前程式碼的執行緒。
getName():獲取當前執行緒的名字。
setName():設置當前執行緒的名字。
yield():釋放當前CPU的執行。
join():在執行緒A中調用執行緒B的join(),此時執行緒A就進入阻塞狀態,直到執行緒B完全執行完之後,執行緒A才結束阻塞狀態。
stop():當執行此方法時,強制結束當前執行緒。(已過時)
sleep():讓當前執行緒「睡眠」指定的millitime毫秒,在指定的millitime毫秒時間內,當前執行緒是阻塞狀態。
isAlive():判斷當前執行緒是否存活。

執行緒的優先順序

NORM_PRIORITY = 5;(默認執行緒級)
MIN_PRIORITY = 1;
MAX_PRIORITY = 10;

如何獲取和設置當前執行緒的優先順序
getPriority():獲取當前執行緒的優先順序。
setPriority(int p):設置當前執行緒的優先順序。

高優先順序的執行緒要搶佔低優先順序執行緒CPU的執行權,但是只是從概率上講,高優先順序的執行緒高概率的情況下被執行。並不意味著只有當高優先順序的執行緒執行完以後,才去執行低優先順序。

創建多執行緒方式二(實現Runnable介面)

① 創建一個實現了Runnable介面的類。
② 實現類去實現Runnable中的抽象方法:run()
③ 創建實現類的對象。
④ 將此對象作為參數傳遞到Thread類的構造器中,創建Thread類的對象。
⑤ 通過Thread類的對象調用start()
第一步:啟動執行緒。
第二步:調用當前執行緒的run()→調用了Runnable類型的targetrun()

//① 創建一個實現了`Runnable`介面的類
class RThread implements Runnable {

    //② 實現類去實現`Runnable`中的抽象方法:`run()`
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + ":" +i);
        }
    }
}
public class ThreadTest1 {
    public static void main(String[] args) {
        //③ 創建實現類的對象
        RThread rThread = new RThread();

        //④ 將此對象作為參數傳遞到Thread類的構造器中,創建Thread類的對象
        Thread thread1 = new Thread(rThread);
        thread1.setName("執行緒一");
        //⑤ 通過Thread類的對象調用start()
        thread1.start();

        //再啟動一個執行緒,遍歷100以內的偶數
        Thread thread2 = new Thread(rThread);
        thread2.setName("執行緒二");
        thread2.start();
    }
}

比較創建執行緒的兩種方式

開發中:優先選擇,實現Runnable介面的方式。
原因:
1.繼承的方式有單繼承的局限性,而實現的方法沒有類的單繼承的局限性。
2.實現的方法更適合來處理多個執行緒有共享數據的情況。

相同點:兩中方式都需要重寫run(),將執行緒要執行的邏輯聲明在run()中。
聯繫public class Thread implements Runnable{}Thread也是實現Runnable介面,也重寫了run()方法。

Tags: