1. 程式人生 > >執行緒併發藝術之一:什麼是執行緒

執行緒併發藝術之一:什麼是執行緒

執行緒

定義不用多說,個人理解就是一條生產線(thread

生產線可以有多條,可以幾乎是同時進行生產,但是能源(cpu資源是有限的,可以通過時間片來輪轉獲得cpu使用權),

生產線有些時候並不需要能源(這裡比喻為能源可能欠妥,姑且稱之為 核能吧,用之不竭的能源),比如需要等待原材料補充(IO操作,耗時較長,但是與cpu無關係),補充完之後才能繼續生產線,製造產品。而對於工廠而言,生產機器能一直執行最好(壓榨cpu),可以帶來更大的利益。

多執行緒就是在某一個執行緒不使用(暫時不使用)cpu的時候,將cpu給需要的執行緒,這樣保證了cpu儘可能的忙。

 

測試程式碼:


/**
 * 測試執行緒
 */
@Slf4j
class MyThread implements  Runnable{
private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public MyThread(int id){
        this.id=id;
    }

    @Override
    public void run() {
        log.info("thread:{}",id);
    }
}
@Slf4j
public class TestThreadPool {
    @Test
    public void testThreadPool(){

    }
    @Test
    public void testThread(){
        int threadCount=10;
        //建立10個執行緒
        List<MyThread> threads=new ArrayList<>();
        for(int i=0;i<threadCount;i++){
            MyThread temp=new MyThread(i);
            threads.add(temp);
        }
        //等待所有執行緒啟動完成
        for(MyThread thread:threads){
//            Causes this thread to begin execution; the Java Virtual Machine
//     * calls the <code>run</code> method of this thread.
            //start方法是讓虛擬機器去呼叫執行緒的run方法,會返回兩個執行緒,
            // 一個是呼叫執行緒的執行緒(也就是主執行緒),另一個是被呼叫的執行緒
            //注意每個執行緒的start方法只能呼叫一次,執行完這個執行緒就結束了
            new Thread(thread).start();
        }
        //測試發現主執行緒不會被堵塞,先輸出“我是主執行緒"  ,然後是亂序的   thread:*
        log.info("我是主執行緒");
    }
}

由測試結果可以看到:

1,start其他執行緒並不會阻塞主執行緒,反而是主執行緒先執行完

2,按照順序start其他執行緒,但是實際執行順序卻不一定與程式碼start順序一致(這點有時候讓我苦惱,捉摸不透順序)