初次瞭解的Java多線程

    0.1熟悉多線程編程

  多線程(英語:multithreading),是指從軟件或者硬件上實現多個線程併發執行的技術。具備多線程能力的計算機因有硬件支持而可以在同一時間執行多於一個線程,進而提高總體處理性能。具備這種能力的系統包括對稱 多處理機、 多核心處理器以及芯片級多處理(Chip-levelmultithreading)或同時多線程(Simultaneousmultithreading)處理器。 在一個程序中,這些獨立運行的程序片斷叫做「線程」(Thread),利用它編程的概念就叫做「多線程處理(Multithreading)」。具備多線程能力的計算機因有硬件支持而可以在同一時間執行多於一個線程(臺灣譯做「執行緒」),進而提高總體處理性能。多線程

 0.2 多線程的定義併發

每一個正在系統上運行的 程序都是一個 進程。每一個 進程包含一到多個線程。 進程也多是整個 程序或者是部分程序的動態執行。線程是一組 指令的集合,或者是 程序的特殊段,它能夠在程序裏獨立執行。也能夠把它理解爲代碼運行的上下文。因此線程基本上是輕量級的 進程,它負責在單個 程序裏執行多 任務。一般由 操做系統負責多個線程的調度和執行。ide

線程是 程序中一個單一的順序控制流程.在單個程序中同時運行多個線程完成不一樣的工做,稱爲多線程.函數

線程和 進程的區別在於,子進程和 父進程有不一樣的 代碼和數據空間,而多個線程則共享數據空間,每一個線程有本身的執行 堆棧和 程序計數器爲其執行上下文.多線程主要是爲了節約CPU時間,發揮利用,根據具體 狀況而定. 線程的運行中須要使用計算機的 內存資源和CPU。性能

0.3多線程的缺點優化

·若是有大量的線程,會影響性能,由於 操做系統須要在它們之間切換。this

·更多的線程須要更多的 內存空間。spa

·線程可能會給 程序帶來更多「bug」,所以要當心使用。操作系統

·線程的停止須要考慮其對 程序運行的影響。

·一般塊模型數據是在多個線程間共享的,須要防止線程死鎖 狀況的發生。

一些線程模型的背景

能夠重點討論一下在 Win32環境中經常使用的一些模型。

·單線程模型

在這種線程模型中,一個 進程中只能有一個線程,剩下的進程必須等待當前的線程執行完。這種模型的缺點在於系統完成一個很小的 任務都必須佔用很長的時間。

·塊線程模型( 單線程多塊模型STA)

這種模型裏,一個 程序裏可能會包含多個執行的線程。在這裏,每一個線程被分爲 進程裏一個單獨的塊。每一個進程能夠含有多個塊,能夠共享多個塊中的數據。 程序規定了每一個塊中線程的執行時間。全部的請求經過 Windows消息隊列進行 串行化,這樣保證了每一個時刻只能訪問一個塊,於是只有一個單獨的 進程能夠在某一個時刻獲得執行。這種模型比 單線程模型的好處在於,能夠響應同一時刻的多個用戶請求的 任務而不僅是單個用戶請求。但它的性能還不是很好,由於它使用了 串行化的線程模型, 任務是一個接一個獲得執行的。

·多線程塊模型(自由線程塊模型)

多線程塊模型(MTA)在每一個 進程裏只有一個塊而不是多個塊。這單個塊控制着多個線程而不是單個線程。這裏不須要 消息隊列,由於全部的線程都是相同的塊的一個部分,而且能夠共享。這樣的 程序比 單線程模型和STA的執行速度都要快,由於下降了系統的負載,於是能夠優化來減小系統idle的時間。這些 應用程序通常比較複雜,由於 程序員必須提供 線程同步以保證線程不會併發的請求相同的資源,於是致使競爭 狀況的發生。這裏有必要提供一個鎖機制。可是這樣也許會致使系統死鎖的發生。

進程和線程都是 操做系統的概念。 進程是 應用程序的執行實例,每一個進程是由私有的虛擬 地址空間、 代碼、數據和其它各類 系統資源組成,進程在運行過程當中建立的資源隨着進程的終止而被銷燬,所使用的 系統資源進程終止時被釋放或關閉。

線程是 進程內部的一個執行單元。系統建立好 進程後,實際上就啓動執行了該進程的主執行線程,主執行線程以函數 地址形式,好比說main或WinMain函數,將 程序的啓動點提供給Windows系統。主執行線程終止了, 進程也就隨之終止。

每個 進程至少有一個主執行線程,它無需由用戶去主動建立,是由系統自動建立的。用戶根據須要在 應用程序中建立其它線程,多個線程併發地運行於同一個 進程中。一個 進程中的全部線程都在該進程的 虛擬地址空間中,共同使用這些虛擬地址空間、 全局變量和系統資源,因此線程間的通信很是方便, 多線程技術的應用也較爲普遍。多線程能夠實現 並行處理,避免了某項 任務長時間佔用CPU時間。要說明的一點是,到2015年爲止,大多數的計算機都是單處理器(CPU)的,爲了運行全部這些線程, 操做系統爲每一個獨立線程安排一些CPU時間,操做系統以輪換方式向線程提供 時間片,這就給人一種假象,好象這些線程都在同時運行。因而可知,若是兩個很是活躍的線程爲了搶奪對CPU的控制權,在線程切換時會消耗不少的CPU資源,反而會下降系統的性能。這一點在多線程編程時應該注意。C++ 11 標準中,STL類庫也實現了多線程的類std::thread,使得多線程編程更加方便。

 

0.4經典案例代碼

 package cn.thread;

public class Through_out_bridge {

    public static void main(String[] args) {
Bridge b = Bridge.getInstance();//實例化橋
//實例化左端9我的,此時全部人都不能過橋,橋的能夠狀態標誌爲不能夠用
for (int i = 1; i <= 9; i++) {
     Thread t = new Thread(new Person(false, i, b));
     t.start();
}
//實例化右端12我的,此時全部人都不能過橋,橋的能夠狀態標誌爲不能夠用 for( int i=1 ;i<=12;i++) {     Thread t = new Thread(new Person(true,i,b));     t.start(); } //橋的可用狀態給左端第10我的,能夠自定義給誰 b.state = true; Thread t = new Thread(new Person(false, 10, b));    }}class Person implements Runnable {    public Bridge bridge;//橋    private String hand;//在橋哪一端    int No;//序號    public Person(boolean side, int i, Bridge bridge) { this.No = i; this.bridge = bridge; if(bridge.state) {     System.out.println(i+"已通過橋。"); } if (side) {     this.hand = new String("右"); } else {     this.hand = new String("左"); }    }    //過橋方法    public synchronized void through() throws InterruptedException { if (bridge.state) {     System.out.println(hand+"邊第"+No + "在過橋");     bridge.open( No); } else {     bridge.lock(No);    }    }    public void run() { try {     Thread.sleep(1000);//     System.out.println(No+hand+" 邊已通過橋!");     through(); } catch (InterruptedException e) {     // TODO Auto-generated catch block     e.printStackTrace(); }    }}class Bridge {    //可用狀態判斷true:可用    public boolean state = false;    //自行實例化    public static Bridge getInstance() { return new Bridge();    }    public synchronized void open(int i) throws InterruptedException { if (state) {     Thread.sleep(1000);     this.state=true;     notify(); }    }    public synchronized void lock(int i) throws InterruptedException { if (!state) {     this.state=false;     System.out.println(i + " 在等待.");     wait(); }    }}

相關文章
相關標籤/搜索