论单线程和多线程
在我們?nèi)粘5捻?xiàng)目開發(fā)過程中進(jìn)場會接觸到單線程或多線程的知識,那么到底多線程好還是單線程好呢?單線程和多線程的區(qū)別又是什么呢?下面我們來看看它們的區(qū)別以及優(yōu)缺點(diǎn)分析及實(shí)例展示。
一、線程的含義
線程:每一個任務(wù)稱為一個線程,線程不能獨(dú)立的存在,它必須是進(jìn)程的一部分
單線程:般常見的Java應(yīng)用程序都是單線程的,比如運(yùn)行helloworld的程序時(shí),會啟動jvm進(jìn)程,然后運(yùn)行main方法產(chǎn)生線程,main方法也被稱為主線程.
多線程:同時(shí)運(yùn)行一個以上線程的程序稱為多線程程序,多線程能滿足程序員編寫高效率的程序來達(dá)到充分利用 CPU 的目的。
二、單線程
每個正在運(yùn)行的程序(即進(jìn)程),至少包括一個線程,這個線程叫主線程
主線程在程序啟動時(shí)被創(chuàng)建,用于執(zhí)行main函數(shù)
只有一個主線程的程序,稱作單線程程序
主線程負(fù)責(zé)執(zhí)行程序的所有代碼(UI展現(xiàn)以及刷新,網(wǎng)絡(luò)請求,本地存儲等等)。這些代碼只能順序執(zhí)行,無法并發(fā)執(zhí)行。
三、多線程
擁有多個線程的程序,稱作多線程程序。
iOS允許用戶自己開辟新的線程,相對于主線程來講,這些線程,稱為子線程
可以根據(jù)需要開辟若干子線程
子線程和主線程都是獨(dú)立的運(yùn)行單元,各自的執(zhí)行互不影響,因此能夠并發(fā)執(zhí)行
四、單線程與多線程的區(qū)別
單線程程序:只有一個線程,代碼順序執(zhí)行,容易出現(xiàn)代碼阻塞。
多線程程序:有多個線程,線程間獨(dú)立運(yùn)行,能有效地避免代碼阻塞,并且提高程序的運(yùn)行性能。
五、單線程與多線程的優(yōu)缺點(diǎn)分析
多線程優(yōu)缺點(diǎn):
同步應(yīng)用程序的開發(fā)比較容易,但由于需要在上一個任務(wù)完成后才能開始新的任務(wù),所以其效率通常比多線程應(yīng)用程序低。如果完成同步任務(wù)所用的時(shí)間比預(yù)計(jì)時(shí)間長,應(yīng)用程序可能會不響應(yīng)。多線程處理可以同時(shí)運(yùn)行多個過程。
例如:文字處理器應(yīng)用程序在您處理文檔的同時(shí),可以檢查拼寫(作為單獨(dú)的任務(wù))。由于多線程應(yīng)用程序?qū)⒊绦騽澐殖瑟?dú)立的任務(wù),因此可以在以下方面顯著提高性能:
多線程技術(shù)使程序的響應(yīng)速度更快,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其他工作的同時(shí)一直處于活動狀態(tài)。
當(dāng)前沒有進(jìn)行處理的任務(wù)可以將處理器時(shí)間讓給其他任務(wù)。
占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其他任務(wù)。
可以隨時(shí)停止任務(wù)。
可以分別設(shè)置各個任務(wù)的優(yōu)先級以優(yōu)化性能。
是否需要創(chuàng)建多線程應(yīng)用程序取決于多個因素。在以下情況下,最適合采用多線程處理:
耗時(shí)或大量占用處理器的任務(wù)阻塞用戶界面操作。
各個任務(wù)必須等待外部資源(如遠(yuǎn)程文件或 INTERNET 連接)。
例如:用于跟蹤 WEB 頁上的鏈接并下載滿足特定條件的文件的 INTERNET 應(yīng)用程序“ROBOT”。這種應(yīng)用程序可以依次同步下載各個文件,也可以使用多線程同時(shí)下載多個文件。多線程方法比同步方法的效率高很多,因?yàn)榧词乖谀承┚€程中遠(yuǎn)程 WEB 服務(wù)器的響應(yīng)非常慢,也可以下載文件。
壞處:增加了調(diào)度和管理的開銷,帶來了一些不確定性,需要復(fù)雜的同步機(jī)制,避免死鎖等等。
好處:一定程度上提高響應(yīng)速度,在多核的情況下還是更能充分利用CPU資源的。
單線程優(yōu)缺點(diǎn):
單線程的也就是程序執(zhí)行時(shí),所跑的程序路徑(處理的東西)是連續(xù)順序下來的,必須前面的處理好,后面的才會執(zhí)行到。
由于時(shí)間片很短,這樣給用戶的感覺是同時(shí)有好多線程在執(zhí)行。但是線程切換是有代價(jià)的,因此如果采用多進(jìn)程,那么就需要將線程所隸屬的該進(jìn)程所需要的內(nèi)存進(jìn)行切換,這時(shí)間代價(jià)是很多的。而線程切換代價(jià)就很少,線程是可以共享內(nèi)存的。所以采用多線程在切換上花費(fèi)的比多進(jìn)程少得多。但是,線程切換還是需要時(shí)間消耗的,所以采用一個擁有兩個線程的進(jìn)程執(zhí)行所需要的時(shí)間比一個線程的進(jìn)程執(zhí)行兩次所需要的時(shí)間要多一些。即采用多線程不會提高程序的執(zhí)行速度,反而會降低速度,但是對于用戶來說,可以減少用戶的響應(yīng)時(shí)間。上述結(jié)果只是針對單CPU,如果對于多CPU或者CPU采用超線程技術(shù)的話,采用多線程技術(shù)還是會提高程序的執(zhí)行速度的。因?yàn)閱尉€程只會映射到一個CPU上,而多線程會映射到多個CPU上,超線程技術(shù)本質(zhì)是多線程硬件化,所以也會加快程序的執(zhí)行速度。
線程相對于進(jìn)程的優(yōu)點(diǎn):
1、開銷小
2、資源共享性好。
線程相對于進(jìn)程的缺點(diǎn):
1、共享資源需要耗費(fèi)一定的鎖資源,同步相對復(fù)雜。
2、一個線程崩潰可能導(dǎo)致整個進(jìn)程崩潰,這個當(dāng)然是自己的應(yīng)用程序有問題
六、單線程與多線程實(shí)例展示
單線程實(shí)例
public class SingleThread {public static void main(String[] args){Thread thread = Thread.currentThread(); //獲取當(dāng)前運(yùn)行的線程對象thread.setName("單線程"); //線程重命名System.out.println(thread.getName()+"正在運(yùn)行");for(int i=0;i<10;i++){System.out.println("線程正在休眠:"+i);try {thread.sleep(1000); //線程休眠,延遲一秒} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("線程出錯");}}} }多線程實(shí)例
注意:多線程有兩種實(shí)現(xiàn)方式,一種是繼承Thread類,另一種是實(shí)現(xiàn)Runnable接口。
繼承Thread類實(shí)現(xiàn)多線程
實(shí)現(xiàn)Runnable接口的多線程
public class RunnableThread {public static void main(String[] args){Runnable rb1=new ImplRunnable("rb1",3000); //Runnable接口必須依托Thread類才能創(chuàng)建線程Thread n1=new Thread(rb1); //Runnable并不能調(diào)用start()方法,因?yàn)椴皇蔷€程,所以要用Thread類加入線程Runnable rb2=new ImplRunnable("rb2",6000);Thread n2=new Thread(rb2);Runnable rb3=new ImplRunnable("rb3",9000);Thread n3=new Thread(rb3);n1.start(); //啟動線程并調(diào)用run方法n2.start();n3.start();} } class ImplRunnable implements Runnable{ //繼承Runnable接口的類String name;int time; public ImplRunnable(String name, int time) { //構(gòu)造線程名字和休眠時(shí)間this.name = name;this.time = time;}@Overridepublic void run() { //實(shí)現(xiàn)Runnable的run方法try{Thread.sleep(time); //所有線程加入休眠}catch(InterruptedException e){e.printStackTrace();System.out.println("線程中斷異常");}System.out.println("名稱為:"+name+",線程休眠:"+time+"毫秒");} }了解更多關(guān)注我喲!!!
總結(jié)
- 上一篇: C++ 处理输入输出错误
- 下一篇: C语言数组初入