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