多執行緒有兩種方式實現多執行緒,一種是繼承thread類,一種是實現runnable介面
繼承thread demo
class
mythread
extends
thread
@override
public
void run() catch (interruptedexception e) }}
}
啟動執行緒:
mythread mt1 = new mythread("執行緒a", 10);
mythread mt2 = new mythread("執行緒b", 15);
mythread mt3 = new mythread("執行緒c", 20);
mt1.start();
mt2.start();
mt3.start();
通過列印的log,我們可以看出,執行緒啟動的先後順序並不相互影響
實現runnable介面 demo
class
myrunnable
implements
runnable
@override
public
void run() catch (interruptedexception e) }}
}
啟動執行緒:
myrunnable myrunnable =
new myrunnable("執行緒d", 45);
newthread(myrunnable).start();
newthread(myrunnable).start();
newthread(myrunnable).start();
通過比較第一種和第二種執行緒的列印的log,我們可以發現第一種啟動方式,是每個執行緒分配多少任務就完成多少任務,並不會共享資源;而第二種方式,共享乙個資源myrunnable
的票數ticket
。
通俗來講,第一種方式是大家各自做各自的事情,各不影響;第二種方式是大家一起做某件事情,也是互不影響各自的程序,數學比較好的各位應該也就可以看出,第二種方式的效率要較高一些。
除此之外,我們都知道在**裡我們只可以繼承乙個類,但是可以實現多個介面,由於以上兩點,我們推薦使用runnable
方式實現多執行緒的目的
拓展 –handler更新ui需要在主線程裡進行,網路請求等耗時操作需要在子執行緒裡實現,那麼我如何在耗時操作完成後去更新ui呢,這就需要handler了,直接看demo
new thread(new runnable()
}).start();
除了這種方式,還有其他的方式
//message由handler建立,可直接向handler傳送訊息
message msg = mhandler.obtainmessage();
msg.sendtotarget();
//message通過new的方式建立,可用handler.sendmessage(msg)來傳送訊息
message msg = new message();
mhandler.sendmessage(msg);
//message通過message.obtain的方式建立,可用sendmessage(msg)來傳送訊息
message msg = message.obtain();
mhandler.sendmessage(msg);
那麼message message = mhandler.obtainmessage()
和message message = new message()
有什麼區別呢:
obtainmessage()
是從訊息池中拿來乙個msg
,不需要另開闢空間new
;
new
需要重新申請,效率低,obtianmessage
可以迴圈利用。
已經傳送資訊後,如何處理:
handler mhandler = new handler(new handler.callback()
return
false;
}});
在這邊也有個小小的拓展:
handler mhandler = new handler(new handler.callback()
})};
public boolean handlemessage
和public void handlemessage
有什麼區別呢:
我查了一下,主要的區別的boolean handlemessage
的返回值決定繼續傳遞給void handlemessage
處理資訊
如果不使用callback()
的boolean handlemessage
,我們是預設訊息會傳遞給void handlemessage
處理資訊
但是使用起來有什麼區別,我現在還沒有看出來,如果有知道的,也可以告訴我一下,互相學習學習。
除了使用handler
來更新ui
,還有一下幾種方式更新ui
// 使用 mhandler.post
new thread(new runnable()
});}
}).start();
// runonuithread
runonuithread(new runnable()
});// 控制項的post
imageview.post(new runnable()
});
非同步處理 asnynctask直接上網路載入的demo
public
class downimage extends asynctask
@override
protected bitmap doinbackground(string... params) catch (exception e)
return bitmap;
}@override
protected
void
onpostexecute(bitmap result)
@override
protected
void
onpreexecute()
@override
protected
void
onprogressupdate(void... values)
}
呼叫:
new downimage(imageview).execute(url);
解釋:
asynctask的三個泛型引數說明(三個引數可以是任何型別)
demo :
public
class
downimage
extends
asynctask
第乙個引數:傳入doinbackground()
方法的引數型別
第二個引數:傳入onprogressupdate()
方法的引數型別
第三個引數:傳入onpostexecute()
方法的引數型別,也是doinbackground()
方法返回的型別。
asynctask遵守準則 :
為了正確的使用asynctask類,以下是幾條必須遵守的準則:
多執行緒和非同步
非同步執行緒 前台執行緒 後台執行緒 預設前台執行緒 有執行緒的取消 完成 失敗通知等互動性操作 通過jion阻塞,達到執行緒執行的先後次序 預設後台執行緒 無線程的取消 完成 失敗通知等互動性操作 可以減少每次建立執行緒的開銷 static void main string args 主線程執行完...
多執行緒和非同步
c 中非同步和多執行緒的區別是什麼呢?非同步和多執行緒兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為非同步和多執行緒是等同的概念。但是,非同步和多執行緒還是有一些區別的。而這些區別造成了使用非同步和多執行緒的時機的區別。所有的程式最終都會由計算機硬體來執行,所...
關於多執行緒和非同步
計算密集型工作,採用多執行緒。io密集型工作,採用非同步機制。多執行緒 新開乙個執行緒執行程式 private void btnmutilthread click object sender,eventargs e public void dosomething 非同步執行程式 減少占有cpu dm...