SlideShare uma empresa Scribd logo
1 de 77
高效能執行緒
Rick。
今天會講 !
Thread
Handler
HandlerThread
Memory leaks
ThreadPool
Asynctask
Service
IntentService
Binder
AIDL
Messenger
為什麼要使用執行緒 ?
情境-早上10點排隊買早餐
A. 蛋餅*1000 奶茶*1000
B. 饅頭*1 豆漿*1
C. 油條*1
D.豆漿*1
由於A買太多早餐, 導致B, C, D只能買午餐
因此需要使用多執行緒(MultiThread)
在Java層級, 如果要使用一個Thread可以這樣寫。
public class MyTask implements Runnable{
public void run(){
//execute your task
}
}
public class Task1 implements Runnable{
public void run(){
//蛋餅*1000 奶茶*1000
}
}
public class Task2 implements Runnable{
public void run(){
//饅頭*1 豆漿*1
}
}
//C,D的執行緒
//...
你可以這樣
買早餐
多執行緒(MultiThread)
優點
同時進行多個任務, 效率高。
缺點
程式複雜度變高
增加資源消耗(context switch、memory)
資料不一致(執行緒不安全)
執行緒不安全
(Thread Unsafe)
int mVar = 0;
public class Task1 implements Runnable{
public void run(){
mVar++;
}
}
public class Task2 implements Runnable{
public void run(){
mVar--;
}
}
資料不一致
sharedVar處於競態條件(race condiction),
造成最終結果不一樣, 可能是 -1, 0 或1。
因此要建立一塊臨界區段(critical section)。
❖Mutual Exclusion (互斥)
➢ 任何一個時間點,最多只允許一個Process進入它自已 的C.S. 內活動,不允許多個Process同時 進
入各自的C.S.內活動。
❖Progress (行進) 須同時滿足下面2個要件:
➢ 1.不想進入C.S.的Process不可以阻礙其它Process進入C.S. (即: 不可參與進入C.S.之決策過程)
➢ 2.必須在有限的時間內,自那些想進入C.S.的Process之中,挑選 出一個Process進入C.S.
➢ (隱含:No Deadlock)
❖Bounded Waiting (有限等待)
➢ 自Process提出進入C.S.之申請,到它獲准進入C.S.之等待時間是有限的。 (隱含:No Starvation)
鎖(Lock)
synchronized關鍵字可以建立一個C.S.
使用鎖會造成其他執行緒被卡住(Blocked)或死結(deadlock),
因此要小心使用。
更多詳情請參照(我的java程式比你的快10倍)
物件如何交換資料?
產生某個類別的實體,當作參數傳遞給另一個實體引用
class A{
private String name;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
class B{
private A a;
public B(A a){
this.a = a;
}
}
又或者可以...
透過第三方協力實體, 兩個實體可透過它存取
class A{
private C c;
public A(C c){
this.c = c;
}
}
class B{
private C c;
public B(C c){
this.c = c;
}
}
Activity怎麼交換資料?
由於Activity是Framework幫我們建立的, 因此取不到實體。
Android提供了兩種方式讓開發者來交換資料
Application
Intent
Android Thread如何傳遞訊息?
Handler
Asynctask
Binder
Service
IntentService
其他還有一些邪魔歪道非官方的方法
(EventBus、Otto、AndroidBus、RxJava…等)
Android Thread
Android一開始會建立一個Main Thread, 專門用來處理UI,
因此必須把處理非UI的任務, 丟到其他Thread去執行,
否則會造成UI Thread在循序處理時,
後面任務在等待前面任務完成才能繼續往下執行。
如果UI Thread沒有及時處理會怎樣?
如果需要更新畫面怎麼辦?
如果Background Thread執行完畢, 需要畫面進行更新,
則會透過Handler來通知Main Thread。
Handler
Handler是Android特有的機制, 透過他可以跟Main Thread進行溝通。
new Thread(new Runnable() {
public void run() {
//這邊是背景thread在運作, 這邊可以處理比較長時間或大量的運算
((Activity) mContext).runOnUiThread(new Runnable() {
public void run() {
//這邊是呼叫main thread handler幫我們處理UI部分
}
});
}
}).start();
view.post(new Runnable(){
public void run(){
//更新畫面
}
});
new Handler(mContext.getMainLooper()).post(new
Runnable(){
public void run(){
//處理少量資訊或UI
}
});
實際上你可以自行定義Looper機制
new Thread(new Runnable() {
public void run() {
Log.e(TAG, "A");
Looper.prepare();
new Handler().post(new Runnable(){
@Override
public void run() {
Log.e(TAG, "B1");
}
});
new Handler().post(new Runnable(){
@Override
public void run() {
Log.e(TAG, "B2");
Looper.myLooper().quit();
}
});
輸出為:
● A
● B1
● B2
● C
● D
//接左邊
Looper.loop();
Log.e(TAG, "C");
((Activity) mContext).runOnUiThread(new Runnable() {
public void run() {
Log.e(TAG, "D");
}
});
}
}).start();
HandlerThread
Android實作了HandlerThread, 讓你輕鬆使用Looper機制。
HandlerThread handlerThread = new HandlerThread("HandlerThread");
handlerThread.start();
Handler mHandler = new Hanlder(handlerThread.getLooper()){
public void handleMessage(Message msg){
super.handleMessage(msg);
switch(msg.what){
case 1:
Logger.e("message receive");
break;
}
}
}
handler.sendEmptyMessage(1);
//或者
new Hanlder(handlerThread.getLooper())
.post(new Runnable(){
public void run(){
//長時間任務1
//長時間任務2
}
});
HandlerThread優缺點
優點 HandlerThread範例
執行緒安全(循序執行)
實作簡單
程式碼乾淨
缺點
Task會blocking, Single Thread無法並行, 效率差。
記憶體洩漏(Memory leaks)
Dalvik VM是記憶體管理系統, 經常使用垃圾回收機制(Garbage Collection),
當一個物件不再使用, GC則會從Heap內將此物件移除回收,
如果該物件有被參照, 則將不會進行回收。
Thread如果沒寫好, 就很容易造成Memory leak。
可以透過LeakCanary這套工具來查看Memory leak。
內部類別(Inner class)造成的Memory leak
public class Outer{
private OtherClass other;
//...
public void sample(){
SampleThread sampleThread = new SampleThread();
sampleThread.start();
}
private class SampleThread extends Thread{
public void run(){
Object sampleObject = new Object();
//long task
}
}
}
靜態內部類別(Static inner class)
public class Outer{
private OtherClass other;
//...
public void sample(){
SampleThread sampleThread = new SampleThread();
sampleThread.start();
}
private static class SampleThread extends Thread{
public void run(){
Object sampleObject = new Object();
//long task
}
}
}
將Runnable外包
可惜的是, 大多數程式設計師, 會將Runnable外包。
即便Thread是static, Runnable物件仍會參照到Outer物件, 造成memory leak。
public class Outer{
private Object o;
public Outer(){
SampleThread sampleThread = new SampleThread(new Runnable(){
public void run(){
o = new Object();
while(true);
}
});
sampleThread.start();
}
private static class SampleThread extends Thread{
public SampleThread(Runnable runnable){
super(runnable);
}
}
事情沒有想像中簡單
在Android更多時候我們會這樣寫。
public class Outer{
Handler mHanlder = new Handler(){
public void handleMessage(Message msg){
//send message
}
};
public void doPost(){
mHanlder.post(new Runnable(){
public void run(){
//do long task
}
});
}
}
如果有參照到Outer內的物件, 只要Thread還在執行,
Outer物件就會memory leak。
怎麼辦才好呢?
使用弱參考(Weak Reference)。
public class Outer{
private Object o;
private MyHandler mHandler;
public Outer(){
o = new Object();
mHandler = new MyHandler(this);
mHandler.post();
}
public Object getObj() {
return o;
}
如此一來, Outer物件一旦沒有參考, 則將被
視為可回收。
private static class MyHandler extends Handler {
private final WeakReference<Outer> mOuter;
public MyHandler(Outer outer){
mOuter = new WeakReference<Outer>(outer);
}
public void post(){
post(new Runnable() {
public void run() {
Outer out = (Outer) mOuter.get();
Object o = out.getObj();
while(true);
}
});
}
}
}
減少memory leak方法
當Thread不再被使用, 請立刻終止它。
清除Message Queue
Handler提供了一些方法可以清除message和callback
removeCallback(Runnable r);
removeMessage(int what);
...更多請參考
http://developer.android.com/reference/android/os/Handler.html
ThreadPool
Java提供了ThreadPoolExecutor讓我們使用, 有幾個優點:
Thread能保持存活, 等待新任務, 不會隨著任務建立再銷毀。
Thread Pool限制最大Thread數量, 避免系統浪費。
Thread的生命週期被Thread Pool控制。
ThreadPoolExecutor自行定義
ThreadPoolExecutor executor = new ThreadPoolExecutor(
int corePoolSize,
int maxPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue
);
參數說明
core pool size(核心緩衝池數量): Thread數量不會低於這個數字。
maxumum pool size(最大緩衝池數量): Thread pool的Thread最大數量
可根據底層硬體來決定數量。
int N = Runtime.getRuntime().availableProcessors();
keep-alive time(最大閒置時間): 超過閒置時間, 系統會回收core Thread數量以上的
Thread。
task queue type(任務佇列類型): 根據策略不同, 所用的演算法也會不同。
內建Executor
固定尺寸執行器 : 固定大小。
Executors.newFixedThreadPool(2);
動態尺寸執行器 : 動態調整, 超過60秒沒做事就被刪掉。
Executors.newCachedThreadPool();
單一執行緒執行器 : 就一個Thread, 後來的任務要排隊。
Executors.newSingleThreadExecutor();
Callable搭配Future
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Object> future = executor.submit(new Callable<Object>(){
public Object call() throws Exception{
Object obj = doLongTask();
return obj;
}
});
Object result = future.get();
與Runnable不同的是Callable可以回傳結果,
透過blocking直到long task完成, 回傳物件。
InvokeAll與InvokeAny的操作
Executor提供同時多個Thread並行的操作。
InvokeAll : 同時並行多個Thread, 並且透過blocking來取回每一個Task的結果。
InvokeAny: 同時並行多個Thread, 只要有一個回傳成功, 則終止剩下的Task。
範例
ExecutorCompletionService的使用
ExecutorCompletionService可以包裹Callable的Task,
當任務結束以後, 可單一回傳結果,
直到所有任務都結束, 則進行關閉。
範例
AsyncTask
想執行長時間運行的任務, 最後再跟UI Thread進行溝通,
Android將這些特性全部封裝在AsyncTask。
如何使用Asynctask ?
class MyTask extends AsyncTask<Params, Progress, Result>{
protected void onPreExecute(){
// in main thread
}
protected Result doInBackground(Params... params){
// in background thread
}
protected void onProgressUpdate(Progress... progress){
// in main thread
}
//接右邊
protected void onPostExecute(Result result){
// in main thread
}
protected void onCancelled(Result result){
// in main thread
}
}
範例-如何使用AsyncTask-實作
參數解說
Params 輸入背景任務的資料。
Progress 由Background Thread跟UI Thread報告進度。
如果要跟UI Thread報告進度, 則可呼叫publishProgress方法。
Result 由Background Thread跟UI Thread報告結果。
AsyncTask的狀態
PENDING : 實體化但未執行execute
RUNNING : execute已經呼叫。
FINISHED : onPostExecute或onCancelled已經被呼叫。
以上三個狀態都是不可逆的, 一旦進入了RUNNING狀態, 就無法再啟動新的執行,
必須重新產生新的實體。
可透過AsyncTask.getStatus()取得狀態資訊。
使用注意事項
AsyncTask跟Thread行為一樣, 執行過後就不能再用了。
而onPostExecute跟onCancelled只會執行其中一個。
必須在UI Thread上執行AsyncTask, 否則Callback將沒作用。
內部有一個全域的ThreadPool, 一旦任務超過核心數, 則將會排入Queue內, 造成後面
任務blocking。
AsyncTask有兩種執行方式: 循序執行(SERIAL_EXECUTOR) 以及
同步進行(THREAD_POOL_EXECUTOR)
AsyncTask執行順序
根據版本不同, 執行順序也不一樣。
API Level execute executeOnExecutor
1 - 3 循序 無
4 - 10 並行 無
11 - 12 並行 循序/並行(可自訂)
13 + 循序 循序/並行(可自訂)
AsyncTask自訂Executor
AsyncTask允許你自訂執行器, 可參考前面所講的內建執行器
//循序
executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, Object... objs);
//並行
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Object... objs);
//自訂
executeOnExecutor(CustomExecutor, Object... objs);
如何使用AsyncTask-自訂執行器
AsyncTask使用情境
以下兩種狀況不適合使用AsyncTask
不使用任何參數執行任務(AsyncTask<Void, Void, Void>
沒有使用參數, 背景執行緒無法跟UI執行緒溝通, 沒有任何回傳結果。
只實做doInBackground
沒有提供報告進度或結果, 就只是個背景任務。
如果有以上的情況, 請洽Thread或HandlerThread, 謝謝。
AsyncTask特殊情況
AsyncTask內塞入有Looper的Thread, 也無法傳遞訊息給該執行緒。
如有上述情況, 要注意不能任意更改該Thread的Looper, 否則會很不方便阻塞其他
Thread, 如果更換Looper也會跳出RuntimeException, 真的要用Looper還是乖乖使用
HandlerThread吧!
AsyncTask塞入Runnable, 這樣只是把AsyncTask當普通的Thread在使用,
優點: 如果AsyncTask內部已經存在Thread, 則會讓資源有效利用。
缺點: AsyncTask是全域環境則會干擾其他Thread運作。
行程(Process)的生命週期
根據官網所提供的資訊, Android在運行多個行程, 會將行程區分成五種等級, 依據等
級來判斷該行程是否可進行回收。
Foreground Process
Visible Process
Service Process
Background Process
Empty Process
Foreground Process!
當Process內的Activity進入了onResume。
某個Service綁定了某個Activity且是處於onResume的狀態。
Service使用了startForeground方法
正在執行onCreate、onStart或onDestroy
BroadcastReceiver正在執行onReceive
Visible Process !
某Activity進入了onPause, 但是User仍看的到(Dialog)。
綁定某個Visible Activity的service。
Service Process!
已經使用startService或者bindService(通常是音樂撥放或者網路下載)
Background Process !
Activity進入onStop, 且已經不可見
系統會根據LRU演算法, 對Background Process進行回收。
Empty Process !
沒有任何活動的Process。
系統優先回收的Process。
Service
為什麼要使用Service?
將元件的生命週期跟Thread的生命週期分開(避免前述Thread參考到元件, 在Thread
結束前無法釋放物件導致Memory leak)
當一個Process內只剩下Thread在執行, 避免Process被系統意外回收, 導致Thread被
提前結束
Service分成兩種形式
被啟動的Service(範例)
由第一個元件啟動請求建立, 第一個元件停止請求銷毀。
被聯繫的Service(範例)
第一個元件Bind, 該Service此時被建立, 直到所有元件Unbind才銷毀。
啟動(Start)的Service
public class ServiceDemo extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
啟動的service非常簡單, 只要覆寫onBind並且回傳null, 接著再多覆寫
onStartCommand, 將Thread寫進此方法即可。
透過startService以及stopService控制啟動即結束,
也可以透過Service.stopSelf自行結束。
Service的重啟
有時候在系統記憶體吃緊的時候, 會將系統某些Service收起來, 這時候有幾個參數可
以讓系統替你重新啟動Service。
START_STICKY : Service被殺掉, 系統會重啟, 但是Intent會是null。
START_NOT_STICKY : Service被系統殺掉, 不會重啟。
START_REDELIVER_INTENT : Service被系統殺掉, 重啟且Intent會重傳。
連繫(Bound)的Service(一)
private LoaclServiceConnection mLoaclServiceConnection = new LoaclServiceConnection();
public class ServiceDemo extends Service {
private MyBinder mBinder = new MyBinder();
private class MyBinder extends Binder{
public ServiceDemo getService(){
return ServiceDemo.this;
}
}
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
連繫(Bound)的Service(二)
private class LoaclServiceConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//透過Binder調用Service內的方法
}
@Override
public void onServiceDisconnected(ComponentName name) {
//service 物件設為null
}
}
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
bindService(new Intent(this, ServiceDemo.class), mLoaclServiceConnection, Context.BIND_AUTO_CREATE);
}
}
IntentService
如果你需要Service循序執行任務, 可以透過IntentService來完成, 背景是透過一個
HandlerThread來進行排程。
public class IntentServiceDemo extends IntentService {
public IntentServiceDemo(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
//背景執行緒
}
}
不需要使用的時候, 系統會自動幫你回收。
範例
IntentService vs. Service
Service
由Client端控制 : User自行控制啟動跟結束
並行任務執行 : 啟動多個Thread
循序且可以重新安排的任務 : 任務可以被賦予優先權 e.g. 音樂服務
IntentService
循序執行
Binder
Binder能讓應用程式在不同行程裡的執行緒之間傳遞函式與資料(方法呼叫)。
客戶端行程呼叫transact方法, 伺服端則會在onTransact接收。
交易資料由Parcel物件所組成,
根據下面網站效能比較, Parcelable比Serializable和Gson更有效率。
http://blog.prolificinteractive.com/2014/07/18/why-we-love-parcelable/
透過下列網站可以輕鬆將物件轉換成Parcelable。
http://www.parcelabler.com/
Binder示意圖
AIDL(Android Interface Definition Language)
AIDL(Android介面定義語言): 當行程想開放功能性給其他行程時, 可透過AIDL來進
行定義, 編譯後會產生支援行程間溝通(IPC, Interprocess communication)的java檔
案。
同步RPC(Remote Procedure Call)
如果你在aidl內定義
interface IMyAidlInterface {
String getThreadName();
}
server端以實作方式實現
private IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub(){
@Override
public String getThreadName() throws RemoteException {
return MyActivity.class.getName();
}
};
AIDL客戶端接收
AIDL客戶端接收
try {
IMyAidlInterface mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(binder);
String threadName = mIMyAidlInterface.getThreadName();
} catch (RemoteException e) {
e.printStackTrace();
}
優點: 單純、好實做、執行緒安全
缺點: 用戶端會被Blocking
非同步RPC
如果要實做非同步, 方法宣告為oneway且回傳值就都是void,
取而代之的是Callback。範例
Server端
定義AIDL
import personal.givemepass.myapplication.IMyAidlInterfaceCallback;
interface IMyAidlInterface {
oneway void getThreadName(IMyAidlInterfaceCallback callback);
}
實做Server端
private final IMyAidlInterface.Stub server = new IMyAidlInterface.Stub(){
@Override
public void getThreadName(IMyAidlInterfaceCallback callback) throws RemoteException {
String name = "aaa";
callback.handleMessage(name);
}
};
Client端RPC
定義AIDL
interface IMyAidlInterfaceCallback {
void handleMessage(String name);
}
實做Client端
private IMyAidlInterfaceCallback.Stub mClient = new IMyAidlInterfaceCallback.Stub(){
@Override
public void handleMessage(String name) throws RemoteException {
//client 接收
}
};
Messenger
Messenger是Android提供處理IPC最簡單的方式, 實際上它底層也是以AIDL為架構,
透過Messenger會在內部使用Handler將任務排列到Thread的Message Queue執行,
是屬於執行緒安全的機制, 也可以透過Message來進行雙向溝通。
範例
Messenger 架構
Binder vs. AIDL vs. Messenger
Binder主要是Android為了IPC而開發出來的。
AIDL跟Messenger最終還是會透過Binder進行IPC。
如果想要同時執行多個執行緒, 那麼AIDL是比較適合的。
如果只是想要傳遞訊息, 並且實做簡單並且執行緒安全, 則可以採用Messenger。
Q & A
Reference
我的java程式比你的快10倍
高效能執行緒
Android核心剖析
http://developer.android.com/guide/components/activities.html
http://developer.android.com/guide/components/tasks-and-back-stack.html
http://developer.android.com/guide/components/services.html
http://developer.android.com/guide/components/processes-and-threads.html

Mais conteúdo relacionado

Mais procurados

Ordonnancement exercices
Ordonnancement exercicesOrdonnancement exercices
Ordonnancement exercicesSelman Dridi
 
Compte Rendu D Intervention
Compte Rendu D InterventionCompte Rendu D Intervention
Compte Rendu D Interventionyouri59490
 
Architecture et programmation des circuits CPLD et des FPGA
Architecture et programmation des circuits CPLD et des FPGAArchitecture et programmation des circuits CPLD et des FPGA
Architecture et programmation des circuits CPLD et des FPGAChiheb Ouaghlani
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io modelNam Hyeonuk
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données IIRiadh Bouslimi
 
Qt Framework Events Signals Threads
Qt Framework Events Signals ThreadsQt Framework Events Signals Threads
Qt Framework Events Signals ThreadsNeera Mital
 
Le Juste A Temps (JAT)
Le Juste A Temps (JAT)Le Juste A Temps (JAT)
Le Juste A Temps (JAT)Noaim ZITOUBY
 
GP Chapitre 4 : La planification de production
GP Chapitre 4 : La planification de production GP Chapitre 4 : La planification de production
GP Chapitre 4 : La planification de production ibtissam el hassani
 
cour PIC16F877.pptx
cour PIC16F877.pptxcour PIC16F877.pptx
cour PIC16F877.pptxKamalZeghdar
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéECAM Brussels Engineering School
 
Organisation maintenance 3
Organisation maintenance 3Organisation maintenance 3
Organisation maintenance 3ONCF
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésECAM Brussels Engineering School
 

Mais procurados (20)

Génie Logiciel : Conception
Génie Logiciel : ConceptionGénie Logiciel : Conception
Génie Logiciel : Conception
 
Ordonnancement exercices
Ordonnancement exercicesOrdonnancement exercices
Ordonnancement exercices
 
Tests Logiciel
Tests LogicielTests Logiciel
Tests Logiciel
 
Soutenance de projet de fin d'études
Soutenance de projet de fin d'étudesSoutenance de projet de fin d'études
Soutenance de projet de fin d'études
 
Rapid json tutorial
Rapid json tutorialRapid json tutorial
Rapid json tutorial
 
Compte Rendu D Intervention
Compte Rendu D InterventionCompte Rendu D Intervention
Compte Rendu D Intervention
 
Architecture et programmation des circuits CPLD et des FPGA
Architecture et programmation des circuits CPLD et des FPGAArchitecture et programmation des circuits CPLD et des FPGA
Architecture et programmation des circuits CPLD et des FPGA
 
Ch 01 poo
Ch 01 pooCh 01 poo
Ch 01 poo
 
Pl enset-cpa
Pl enset-cpaPl enset-cpa
Pl enset-cpa
 
Tcp ip & io model
Tcp ip & io modelTcp ip & io model
Tcp ip & io model
 
Algorithmique et Structures de Données II
Algorithmique et Structures de Données IIAlgorithmique et Structures de Données II
Algorithmique et Structures de Données II
 
Qt Framework Events Signals Threads
Qt Framework Events Signals ThreadsQt Framework Events Signals Threads
Qt Framework Events Signals Threads
 
Cours Génie Logiciel - Introduction
Cours Génie Logiciel - IntroductionCours Génie Logiciel - Introduction
Cours Génie Logiciel - Introduction
 
Le Juste A Temps (JAT)
Le Juste A Temps (JAT)Le Juste A Temps (JAT)
Le Juste A Temps (JAT)
 
GP Chapitre 4 : La planification de production
GP Chapitre 4 : La planification de production GP Chapitre 4 : La planification de production
GP Chapitre 4 : La planification de production
 
cour PIC16F877.pptx
cour PIC16F877.pptxcour PIC16F877.pptx
cour PIC16F877.pptx
 
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarquéProgrammation de systèmes embarqués : BeagleBone Black et Linux embarqué
Programmation de systèmes embarqués : BeagleBone Black et Linux embarqué
 
Organisation maintenance 3
Organisation maintenance 3Organisation maintenance 3
Organisation maintenance 3
 
Prince2 Synthèse
Prince2 SynthèsePrince2 Synthèse
Prince2 Synthèse
 
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarquésProgrammation de systèmes embarqués : Introduction aux systèmes embarqués
Programmation de systèmes embarqués : Introduction aux systèmes embarqués
 

Destaque

怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 CodeWeizhong Yang
 
reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)Chonpin HSU
 
作業系統基本觀念複習
作業系統基本觀念複習作業系統基本觀念複習
作業系統基本觀念複習azole Lai
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹My own sweet home!
 
Android studio & Git in Windows
Android studio & Git in WindowsAndroid studio & Git in Windows
Android studio & Git in WindowsPin-Lun Huang
 
U boot 程式碼打掃計畫
U boot 程式碼打掃計畫U boot 程式碼打掃計畫
U boot 程式碼打掃計畫Macpaul Lin
 
U boot source clean up project how-to
U boot source clean up project how-toU boot source clean up project how-to
U boot source clean up project how-toMacpaul Lin
 
How to build a community in a company blue&macpaul coscup2015
How to build a community in a company blue&macpaul coscup2015How to build a community in a company blue&macpaul coscup2015
How to build a community in a company blue&macpaul coscup2015Macpaul Lin
 
API Token 入門
API Token 入門API Token 入門
API Token 入門Andrew Wu
 
Android x 網路爬蟲
Android x 網路爬蟲Android x 網路爬蟲
Android x 網路爬蟲Engine Bai
 
Python 網頁爬蟲由淺入淺
Python 網頁爬蟲由淺入淺Python 網頁爬蟲由淺入淺
Python 網頁爬蟲由淺入淺hackstuff
 
Slideshare簡介
Slideshare簡介Slideshare簡介
Slideshare簡介Sports Kuo
 
大型 Web Application 轉移到 微服務的經驗分享
大型 Web Application 轉移到微服務的經驗分享大型 Web Application 轉移到微服務的經驗分享
大型 Web Application 轉移到 微服務的經驗分享Andrew Wu
 
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】青年創業及圓夢網 創業計畫書撰寫【創業懶人包】
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】RICK Lin
 

Destaque (16)

怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code怎樣寫出比較沒有問題的 Code
怎樣寫出比較沒有問題的 Code
 
reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)reading group 成為卓越程式設計師的38項必修法則(20~23)
reading group 成為卓越程式設計師的38項必修法則(20~23)
 
貪食蛇
貪食蛇貪食蛇
貪食蛇
 
作業系統基本觀念複習
作業系統基本觀念複習作業系統基本觀念複習
作業系統基本觀念複習
 
From UX to Product
From UX to ProductFrom UX to Product
From UX to Product
 
Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹Java API for WebSocket 實作介紹
Java API for WebSocket 實作介紹
 
Android studio & Git in Windows
Android studio & Git in WindowsAndroid studio & Git in Windows
Android studio & Git in Windows
 
U boot 程式碼打掃計畫
U boot 程式碼打掃計畫U boot 程式碼打掃計畫
U boot 程式碼打掃計畫
 
U boot source clean up project how-to
U boot source clean up project how-toU boot source clean up project how-to
U boot source clean up project how-to
 
How to build a community in a company blue&macpaul coscup2015
How to build a community in a company blue&macpaul coscup2015How to build a community in a company blue&macpaul coscup2015
How to build a community in a company blue&macpaul coscup2015
 
API Token 入門
API Token 入門API Token 入門
API Token 入門
 
Android x 網路爬蟲
Android x 網路爬蟲Android x 網路爬蟲
Android x 網路爬蟲
 
Python 網頁爬蟲由淺入淺
Python 網頁爬蟲由淺入淺Python 網頁爬蟲由淺入淺
Python 網頁爬蟲由淺入淺
 
Slideshare簡介
Slideshare簡介Slideshare簡介
Slideshare簡介
 
大型 Web Application 轉移到 微服務的經驗分享
大型 Web Application 轉移到微服務的經驗分享大型 Web Application 轉移到微服務的經驗分享
大型 Web Application 轉移到 微服務的經驗分享
 
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】青年創業及圓夢網 創業計畫書撰寫【創業懶人包】
青年創業及圓夢網 創業計畫書撰寫【創業懶人包】
 

Semelhante a 高效能執行緒

Node cluster
Node clusterNode cluster
Node clusteraleafs
 
线程与并发
线程与并发线程与并发
线程与并发Tony Deng
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJustin Lin
 
并发编程实践与思考
并发编程实践与思考并发编程实践与思考
并发编程实践与思考promise6522
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇bluedavy lin
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版Jackson Tian
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsHo Kim
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsHo Kim
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践taobao.com
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Chu-Siang Lai
 
实时任务调度
实时任务调度实时任务调度
实时任务调度Tony Deng
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorAdy Liu
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发litaocheng
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江thinkinlamp
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysqlpwesh
 
系統程式 -- 第 10 章
系統程式 -- 第 10 章系統程式 -- 第 10 章
系統程式 -- 第 10 章鍾誠 陳鍾誠
 

Semelhante a 高效能執行緒 (20)

Node cluster
Node clusterNode cluster
Node cluster
 
Java Thread
Java ThreadJava Thread
Java Thread
 
线程与并发
线程与并发线程与并发
线程与并发
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
并发编程实践与思考
并发编程实践与思考并发编程实践与思考
并发编程实践与思考
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇
 
D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版D2_node在淘宝的应用实践_pdf版
D2_node在淘宝的应用实践_pdf版
 
JavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization SkillsJavaScript 80+ Programming and Optimization Skills
JavaScript 80+ Programming and Optimization Skills
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
Node.js在淘宝的应用实践
Node.js在淘宝的应用实践Node.js在淘宝的应用实践
Node.js在淘宝的应用实践
 
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
Continuous Delivery Workshop with Ansible x GitLab CI (2nd)
 
实时任务调度
实时任务调度实时任务调度
实时任务调度
 
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutorInside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
Inside.java.concurrency 35.thread pool.part8_future.scheduledthreadpoolexecutor
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
Tcfsh bootcamp day2
 Tcfsh bootcamp day2 Tcfsh bootcamp day2
Tcfsh bootcamp day2
 
Storm
StormStorm
Storm
 
2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江2011 06-12-lamp-mysql-顾春江
2011 06-12-lamp-mysql-顾春江
 
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql2011 06-12-lamp-mysql
2011 06-12-lamp-mysql
 
系統程式 -- 第 10 章
系統程式 -- 第 10 章系統程式 -- 第 10 章
系統程式 -- 第 10 章
 

高效能執行緒