多執行緒和非同步處理

2021-08-08 17:42:51 字數 4084 閱讀 6013

多執行緒

有兩種方式實現多執行緒,一種是繼承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 handlemessagepublic 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...