併發通常是提高執行在單處理器上的程式的效能。當以單執行緒執行所有任務時,雖然不會因為切換執行緒節省資源,但一旦出現阻塞(io請求等),則在阻塞接觸前單執行緒會發生等待。如果採用併發可在此時切換任務節省時間。(所以沒有任務會被阻塞的情況下在單處理器上使用併發並沒有意義)
cpu輪流給每個執行緒任務分配其占用時間。(例外情況是程式執行在多個cpu之上)
建立執行緒的多種方法:
- 通過extends thread實現:
public
class
mythread
extends
thread
}//main中啟動執行緒
new mythread().start();
public
class
myrunnable
implements
runnable
}//main中啟動執行緒
new thread(new myrunnable()).start();
public
class
mycallable
implements
callable
/*callable介面與runnable不同點在於實現的是call方法
* 此方法可return定義好的callable介面的泛型型別,如此處的integer
* 而runnable的run方法是void的
* */
@override
public integer call() throws exception
}//main中啟動執行緒
mycallable mycallable=new mycallable(1);
//futuretask是乙個實現了runnable以及callable的包裝類,借助它來建立thread
futuretaskfuturetask=new futuretask(mycallable);
new thread(futuretask).start();
//可獲取call的返回值,futuretask是future的實現類
futuretask.get();
/*建立乙個快取執行緒池(執行過程中建立與與所需數量相同的執行緒,並在開始**舊執行緒時停止建立。cached執行緒池通常是合理的首選)
*/executorservice executor=executors.newcachedthreadpool();
/*建立乙個固定大小的執行緒池,例如這裡設定為5。假如我們for迴圈建立50個任務。則總是只會有5個執行緒在執行。
例如12345,如果2最先執行完畢,執行緒銷毀,那麼這時候才會加入新的執行緒執行13456
*/executorservice executor=executors.newfixedthreadpool(5);
/*建立乙個單一執行緒池,相當於大小為1的固定執行緒池,例如我們for迴圈加入五十個任務,用單一執行緒池進行執行,會跑完乙個任務才會執行下乙個任務
*/executorservice executor=executors.newsinglethreadexecutor();
/*將任務加入執行緒池進行執行
*/executor.execute(runnable runnable);//return void
executor.submit(callablecallable);//return future
/*取值前先進行判斷,因為future.isdone()方法用於檢查future物件是否已經用callable返回值完成了引數化。完成了就可以get()到值,如果未完成時呼叫get(),則get()方法會阻塞至完成後執行。
*/if(future.isdone)
/*關閉執行緒池。例如我們在執行執行緒main中呼叫此方法意味著當前執行緒(main)將繼續執行shutdown前我們提交的執行緒任務,並在所有任務完成後盡快退出。
*/executor.shutdown();
總結
thread是執行緒,而runnable,callable,以及通過extends thread重寫的run,均是相當於乙個任務物件。
我們可以直接在thread構造引數裡傳入runnable任務來建立執行緒,也可以借助futuretask來包裝callable建立執行緒。
執行緒池是事先設定一定數目的執行緒儲存空間。通過execute加入runnable任務,or通過submit加入callable任務。
callable任務與runnable任務不同點在於,前者具有返回值。
可通過future的get()獲取。future介面定義了cancel(),scancelled(),isdone(),get()等方法用於控制和查詢。
futuretask是future的具體實現類,(implements runnablefuture,而runnablefuture介面又extends runnable,future)
singlethreadexecutor因為同一時刻只有乙個執行緒在執行,所以也能解決共享資源的同步,但更推薦對資源本身進行同步處理(鎖機制)
執行緒池 1 任務佇列模組
執行緒池的思想早有耳聞,中間也涉及好多內容,回過頭來重新設計一下執行緒池.使用者視角 1.建立乙個執行緒池物件,threadpool thpool int minthreads 同時會建立乙個管理者執行緒,負責維護執行緒池,可以通過演算法動態排程增加或減少執行緒 2.加入乙個任務 int thpoo...
併發程式設計7 任務取消
通常如下情況會取消 1.使用者發起取消請求 2.現實的活動 3.分解任務其中一條發現了解決方案,其他的就可以取消了 4.分解任務其中一條發現了對於其他任務都有影響的錯誤,比如磁碟空間已滿,其他的可以取消了 5.關閉,當執行器關閉的時候,必須對正在處理及等待處理的任務進行優雅的關閉。乙個最簡單的方式是...
FreeRtos 1 任務建立與管理
freertos實時作業系統移植 以上是歷史freertos部落格。freertos系列我會堅持更下去。任務的建立函式 basetype t xtaskcreate taskfunction t pxtaskcode,const char const pcname,const configstack...