多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程併發執行的技術。具備多線程能力的計算機因有硬件支持而可以在同一時間執行多於一個線程,進而提高總體處理性能。具備這種能力的系統包括對稱多處理機、多核心處理器以及芯片級多處理(Chip-levelmultithreading)或同時多線程(Simultaneousmultithreading)處理器。 在一個程序中,這些獨立運行的程序片斷叫做「線程」(Thread),利用它編程的概念就叫做「多線程處理(Multithreading)」。具備多線程能力的計算機因有硬件支持而可以在同一時間執行多於一個線程(臺灣譯做「執行緒」),進而提高總體處理性能。java
線程定義數據庫
英文:Thread編程
每一個正在系統上運行的 程序都是一個 進程。每一個 進程包含一到多個線程。 進程也多是整個 程序或者是部分程序的動態執行。線程是一組 指令的集合,或者是 程序的特殊段,它能夠在程序裏獨立執行。也能夠把它理解爲代碼運行的上下文。因此線程基本上是輕量級的 進程,它負責在單個 程序裏執行多 任務。一般由 操做系統負責多個線程的調度和執行。segmentfault
線程是 程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程.網絡
線程和 進程的區別在於,子進程和 父進程有不一樣的 代碼和數據空間,而多個線程則共享數據空間,每一個線程有本身的執行 堆棧和 程序計數器爲其執行上下文.多線程主要是爲了節約CPU時間,發揮利用,根據具體 狀況而定. 線程的運行中須要使用計算機的 內存資源和CPU。多線程
缺點併發
·若是有大量的線程,會影響性能,由於 操做系統須要在它們之間切換。框架
·更多的線程須要更多的 內存空間。ide
·線程可能會給 程序帶來更多「bug」,所以要當心使用。函數
·線程的停止須要考慮其對 程序運行的影響。
·一般塊模型數據是在多個線程間共享的,須要防止線程死鎖 狀況的發生。
一些線程模型的背景
能夠重點討論一下在 Win32環境中經常使用的一些模型。
·單線程模型
在這種線程模型中,一個 進程中只能有一個線程,剩下的進程必須等待當前的線程執行完。這種模型的缺點在於系統完成一個很小的 任務都必須佔用很長的時間。
·塊線程模型( 單線程多塊模型STA)
這種模型裏,一個 程序裏可能會包含多個執行的線程。在這裏,每一個線程被分爲 進程裏一個單獨的塊。每一個進程能夠含有多個塊,能夠共享多個塊中的數據。 程序規定了每一個塊中線程的執行時間。全部的請求經過 Windows消息隊列進行 串行化,這樣保證了每一個時刻只能訪問一個塊,於是只有一個單獨的 進程能夠在某一個時刻獲得執行。這種模型比 單線程模型的好處在於,能夠響應同一時刻的多個用戶請求的 任務而不僅是單個用戶請求。但它的性能還不是很好,由於它使用了 串行化的線程模型, 任務是一個接一個獲得執行的。
·多線程塊模型(自由線程塊模型)
多線程塊模型(MTA)在每一個 進程裏只有一個塊而不是多個塊。這單個塊控制着多個線程而不是單個線程。這裏不須要 消息隊列,由於全部的線程都是相同的塊的一個部分,而且能夠共享。這樣的 程序比 單線程模型和STA的執行速度都要快,由於下降了系統的負載,於是能夠優化來減小系統idle的時間。這些 應用程序通常比較複雜,由於 程序員必須提供 線程同步以保證線程不會併發的請求相同的資源,於是致使競爭 狀況的發生。這裏有必要提供一個鎖機制。可是這樣也許會致使系統死鎖的發生。
進程和線程都是 操做系統的概念。 進程是 應用程序的執行實例,每一個進程是由私有的虛擬 地址空間、 代碼、數據和其它各類 系統資源組成,進程在運行過程當中建立的資源隨着進程的終止而被銷燬,所使用的 系統資源在進程終止時被釋放或關閉。
線程是 進程內部的一個執行單元。系統建立好 進程後,實際上就啓動執行了該進程的主執行線程,主執行線程以函數 地址形式,好比說main或WinMain函數,將 程序的啓動點提供給Windows系統。主執行線程終止了, 進程也就隨之終止。
每個 進程至少有一個主執行線程,它無需由用戶去主動建立,是由系統自動建立的。用戶根據須要在 應用程序中建立其它線程,多個線程併發地運行於同一個 進程中。一個 進程中的全部線程都在該進程的 虛擬地址空間中,共同使用這些虛擬地址空間、 全局變量和系統資源,因此線程間的通信很是方便, 多線程技術的應用也較爲普遍。多線程能夠實現 並行處理,避免了某項 任務長時間佔用CPU時間。要說明的一點是,到2015年爲止,大多數的計算機都是單處理器(CPU)的,爲了運行全部這些線程, 操做系統爲每一個獨立線程安排一些CPU時間,操做系統以輪換方式向線程提供 時間片,這就給人一種假象,好象這些線程都在同時運行。因而可知,若是兩個很是活躍的線程爲了搶奪對CPU的控制權,在線程切換時會消耗不少的CPU資源,反而會下降系統的性能。這一點在多線程編程時應該注意。C++ 11 標準中,STL類庫也實現了多線程的類std::thread,使得多線程編程更加方便。
Thread
類Runnable
接口run()
方法 和 start()
方法run()
方法裏面,等待調用,這部分每每處理網絡通訊和數據庫處理。start()
的使用是開始線程的標誌。也是線程的生命週期開始的地方。不管用前面的那種方式使用線程。使用Runnable實現
/** * 實現Runnable接口的類 */ public class DoSomething implements Runnable { private String name; public DoSomething(String name) { this.name = name; } public void run() { for (int i = 0; i < 5; i++) { for (long k = 0; k < 100000000; k++) ; System.out.println(name + ": " + i); } } } /** * 測試Runnable類實現的多線程程序 */ public class TestRunnable { public static void main(String[] args) { DoSomething ds1 = new DoSomething("阿三"); DoSomething ds2 = new DoSomething("李四"); Thread t1 = new Thread(ds1); Thread t2 = new Thread(ds2); t1.start(); t2.start(); } }
使用Thread類實現:
/** * 測試擴展Thread類實現的多線程程序 */ public class TestThread extends Thread{ public TestThread(String name) { super(name); } public void run() { for(int i = 0;i<5;i++){ for(long k= 0; k <100000000;k++); System.out.println(this.getName()+" :"+i); } } public static void main(String[] args) { Thread t1 = new TestThread("阿三"); Thread t2 = new TestThread("李四"); t1.start(); t2.start(); } }
在整個Java線程中,實現並非最難的,相反,線程有要注意的幾個難點:
Java多線程執行框架
線程執行框架啓動線程
將要多線程執行的任務封裝爲一個Runnable對象,將其傳給一個執行框架Executor對象, Executor從線程池中選擇線程執行工做任務。
建立多線程框架對象調用線程執行任務
咱們一般經過Executors類的一些靜態方法來實例化Executor或ThreadPoolExecutor對象:
好比Executor對象來執行:
public class ThreadTest { public static void main(String[] args) { Executor executor = Executors.newSingleThreadExecutor(); executor.execute(new MyRunnable()); } } class MyRunnable implements Runnable { @Override public void run() { System.out.println("running"); } }
好比線程池的Executor對象來執行:
public class ThreadTest { public static void main(String[] args) { ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors .newFixedThreadPool(3); executor.execute(new MyRunnable()); } } class MyRunnable implements Runnable { @Override public void run() { System.out.println("running"); } }
目前就學了這些 之後會補充的!!!!