1. 程式人生 > 實用技巧 >多執行緒(一)

多執行緒(一)

面試題

1.談談你對程式、程序、執行緒的理解

程式(program)是為完成特定任務、用某種語言編寫的一組指令的集合。即指一段靜態的程式碼,靜態物件。
程序(process)是程式的一次執行過程,或是正在執行的一個程式。程序作為資源分配的單位,系統在執行時會為每個程序分配不同的記憶體區域
執行緒(thread),程序可進一步細化為執行緒,是一個程式內部的一條執行路徑。

2.程式碼完成繼承 Thread 的方式建立分執行緒,並遍歷100以內的自然數

/**
 * 多執行緒的建立,方式一:繼承於Thread類
 * 1.建立一個繼承於Thread類的子類
 * 2.重寫Thread的run()方法 ---> 將此執行緒的方法宣告在run()中
 * 3.建立Thread類的子物件
 * 4.通過此物件呼叫start()
 *
 * 例子:遍歷100以內的自然數
 *
 * 說明:高優先順序的執行緒要搶佔低優先順序執行緒cpu的執行權。
 *      但是隻是從概率上講,高優先順序的執行緒高概率的情況下被執行。
 *      並不意味著只有當高優先順序的執行緒執行完以後,低優先順序的執行緒才會被執行。
 *
 * @author alpaca
 * @create 2020-06-28 9:11
 */

//1.建立一個繼承於Thread類的子類
class MyThread extends Thread{
    //2.重寫Thread類的run()
    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName() + ":" +Thread.currentThread().getPriority()+":"+ i);
        }
    }

}

public class ThreadTest {
    public static void main(String[] args) {
        //3.建立Thread類的子物件
        MyThread t1 = new MyThread();

        t1.setName("執行緒一:");
        //設定分執行緒的優先順序
        t1.setPriority(Thread.MAX_PRIORITY);

        //4.通過此物件呼叫start():①啟動當前執行緒 ②呼叫當前執行緒的run()
        t1.start();

        Thread.currentThread().setName("主執行緒:");
        Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

        //如下操作仍在main執行緒中執行的
        for(int i=0;i<500;i++){
            if(i%2==0) {
                //i.sout
                System.out.println(Thread.currentThread().getName()
                        + ":" +Thread.currentThread().getPriority()
                        + ":"+i + "****main()****");
            }
        }

    }
}

3.程式碼完成實現 Runnable 介面的方式建立分執行緒,並遍歷100以內的自然數

/**
 *
 * 建立多執行緒的方式二:實現Runnable介面
 * 1.建立一個實現了Runnable介面得類
 * 2.實現類去實現Runnable中的抽象方法:run()
 * 3.建立實現類的物件
 * 4.將此物件作為引數傳遞到Thread類的構造器中,建立Thread類的物件
 * 5.通過Thread類的物件呼叫start()
 *
 *
 * @author alpaca
 * @create 2020-06-28 11:42
 */

//1.建立一個實現了Runnable介面得類
class MThread implements Runnable{

    //2.實現類去實現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) {
        //3.建立實現類的物件
        MThread m1 = new MThread();
        //4.將此物件作為引數傳遞到Thread類的構造器中,建立Thread類的物件
        //Ctrl + P 可以檢視引數
        Thread t1 = new Thread(m1);
        //5.通過Thread類的物件呼叫start():①啟動執行緒
        // ②呼叫當前執行緒的run() --> 呼叫了Runnable型別的target的run()
        t1.start();

        //再啟動一個執行緒,遍歷100以內的自然數
        Thread t2 = new Thread(m1);
        t2.setName("執行緒2");
        t2.start();
    }
}

4.對比兩種建立方式

開發中:優先選擇:實現Runnable介面的方式
原因:1. 實現的方式沒有類的單繼承性的侷限性
2. 實現的方式更適合來處理多個執行緒有共享資料的情況。
聯絡:public class Thread implements Runnable
相同點:兩種方式都需要重寫run(),將執行緒要執行的邏輯宣告在run()中。

5.說說你對 IDAE 中 Project 和 Moudule 的理解

IDAE 中首先建立一個工程 (Project) ,最頂級的結構,
在工程下面可以宣告一個一個的模組 (Moudule)