併發1 任務與執行緒

2021-07-23 01:57:48 字數 2568 閱讀 2716

併發通常是提高執行在單處理器上的程式的效能。當以單執行緒執行所有任務時,雖然不會因為切換執行緒節省資源,但一旦出現阻塞(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...