進程:每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷,一個進程包含1--n個線程。
線程:同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換開銷小。
線程和進程一樣分為五個階段:創建、就緒、運行、阻塞、終止。
多進程是指操作系統能同時運行多個任務(程序)。
多線程是指在同一程序中有多個順序流在執行。
在java中要想實現多線程,有兩種手段,一種是繼續Thread類,另外一種是實現Runable接口。
實現Runnable接口比繼承Thread類所具有的優勢:
1):適合多個相同的程序代碼的線程去處理同一個資源
2):可以避免java中的單繼承的限制
3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立。
線程的四種狀態:
開始(等待)、運行、掛起、停止
1、進程和線程的概念
進程:運行中的應用程序稱為進程,擁有系統資源(cpu、內存)
線程:進程中的一段代碼,一個進程中可以有多段代碼。本身不擁有資源(共享所在進程的資源)
在Java中,程序入口被自動創建為主線程,在主線程中可以創建多個子線程。
區別:
1、是否占有資源問題
2、創建或撤銷一個進程所需要的開銷比創建或撤銷一個線程所需要的開銷大。
3、進程為重量級組件,線程為輕量級組件
多進程: 在操作系統中能同時運行多個任務(程序)
多線程: 在同一應用程序中有多個功能流同時執行
2、線程的主要特點
①、不能以一個文件名的方式獨立存在在磁盤中;
②、不能單獨執行,只有在進程啟動后才可啟動;
③、線程可以共享進程相同的內存(代碼與數據)。
3、線程的主要用途
①、利用它可以完成重復性的工作(如實現動畫、聲音等的播放)。
②、從事一次性較費時的初始化工作(如網絡連接、聲音數據文件的加載)。
③、並發執行的運行效果(一個進程多個線程)以實現更復雜的功能
4、多線程(多個線程同時運行)程序的主要優點
①、可以減輕系統性能方面的瓶頸,因為可以並行操作;
②、提高CPU的處理器的效率,在多線程中,通過優先級管理,可以使重要的程序優先操作,提高了任務管理的靈活性;另一方面,在多CPU系統中,可以把不同的線程在不同的CPU中執行,真正做到同時處理多任務。
多線程和單線程:
線程本身由於創建和切換的開銷,采用多線程並不會提高程序的執行速度,反而會降低速度,(對於頻繁的IO操作的程序,單線程情況下,雖然兩個程序主要使用不同的資源,但是在線程內部只能串行執行,在IO操作時,CPU被閑置,多線程情況下,如果一個線程在等待IO操作,線程會馬上調度到另一個線程,並發的使用了不同的資源。)
多線程應用:耗時或大量占用處理器的任務阻塞用戶界面操作,各個任務必須等待外部資源
多線程的實現:
繼承thread類,實現runable接口
其實原理上是一樣的因為繼承的Thread類也是實現runable接口的
然后thread類和runable接口都實現了run方法,其實這種模式就是代理模式的一種體現。
Thread與runable區別:
如果一個類繼承Thread類,則不適合共享資源,但是如果實現Runable接口的話就很容易實現共享資源了。
實現runable接口適合多個相同的程序代碼的線程去處理同一個資源
可以避免java中單繼承的限制:例如你既要使用多線程繼承Thread又要使用定時器繼承Timertask這樣就會有沖突
增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立
所以在實際應用中我們盡量使用實現接口的方式
注意:其實main方法也是一個線程,java中所有線程都是同時啟動的,至於誰先執行那就看誰先得到CPU資源了,每次程序運行的時候會同時啟動兩個線程,一個是main線程,另一個就是垃圾收集線程,每當我們啟動一個java類的時候就會執行一個jvm。
還需要注意的一點就是,線程雖然有優先級之分,但是其實並不是誰的優先級越高就越早執行,誰先執行主要看誰先得到CPU使用資源,只能說優先級高的線程比較容易獲得CPU使用權,但並不一定他會先執行,只能說他先執行的概率會大很多。
定時器所繼承的Timer工具類實際上也是一個實現了Runable接口的抽象類,我們通過繼承這個類來創建定時任務,安排一個線程在未來某個時間執行。
線程安全:多個線程同時操作同一個對象,就容易出現數據混亂現象,所以多線程時最好加上同步鎖
線程安全問題最容易出現在單例模式中
就好比同一件東西,,一個人(代表線程)使用了,另一個人也同時使用,這件東西的內容就會出現混亂,而對象鎖的作用就是說明這個東西只許一個人使用,他使用完后才允許另一個人使用。
文件轉移:
一般的話需要一個執行完了之后下一個才能進行,而使用線程的話可以同時運行,就好比一個是一列隊伍一個一個去進行,而線程的話就好比是一行都已經准備就緒同時進行,所以線程的話效率高的多,