執行緒併發藝術之一:什麼是執行緒
阿新 • • 發佈:2018-11-07
執行緒:
定義不用多說,個人理解就是一條生產線(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順序一致(這點有時候讓我苦惱,捉摸不透順序)