1. 程式人生 > >談談java中的併發(一)

談談java中的併發(一)

一.併發的定義 併發:對於這個概念一直就是沒怎麼搞懂,就是感覺特別的生疏,(自己從從字面上理解就是多個東西,一起出發),所以就上網上查了一些資料: 同時擁有兩個或多個執行緒,如果程式在單核處理器上執行,多個執行緒將交替地換入或者換出記憶體,這些執行緒是同時“存在”的,每個執行緒都處於執行過程中的某個狀態,如果執行在多核處理器上,此時,程式中的每個執行緒都將分配到一個處理器核上,因此可以同時執行。 高併發(High Concurrency): 是網際網路分散式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。 兩者區別: 併發:多個執行緒操作相同的資源,保證執行緒安全,合理使用資源。 高併發(High Concurrency):服務能同時處理很多請求,提高程式效能 二.執行緒的定義 1.執行緒(英語:thread)是作業系統能夠進行運算排程的最小單位。它被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中一個單一順序的控制流,一個程序中可以併發多個執行緒,每條執行緒並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量程序(lightweight processes),但輕量程序更多指核心執行緒(kernel thread),而把使用者執行緒(user thread)稱為執行緒。 在網上查資料執行緒是這麼定義的,其實說簡單點,執行緒其實就是可以多個同時進行,也稱之為多執行緒。下面是個生活中的例子 ``` 比如一天突然來一個電話,張三跟我說:“他的朋友李四的卡里面沒有錢了,想讓我借給他的朋友點 ,我之後便去銀行,到了銀行,我先把錢轉給張三,之後張三再把錢轉到他的朋友李四的卡里。 其實,這個例子就是多執行緒的同時操作,第一個執行緒是 我把錢轉到張三的卡里面 ;第二個執行緒是 張三在把錢轉到李四的卡里。 ``` ``` 在有一個例子:都聽過龜兔賽跑的事情吧!這其實也是多執行緒的問題 兔子和烏龜同時從原點出發,比誰先到終點,這其實就是兩個多執行緒共同進行,且互不影響。 ``` ``` 在譬如說:咱們執行一個程式,程式沒開始執行的時候是靜態的,經過程序,再到執行緒, 它真正執行的也就是執行緒,其中main()稱之為主執行緒。 ``` ``` 在實際生活中多執行緒也是非常有用的, 比如,我們在瀏覽器上可以同時下載幾張圖片。 ``` 上面所說的都是執行緒的例子,它還是與我們生活密切相關的,用處也是非常大的。 執行緒就是獨立的執行路徑 在程式執行時,即使沒有自己建立執行緒,後臺也會有多少少執行緒,如主執行緒,gc執行緒 main()稱之為主執行緒,為系統的入口,用於執行整個程式 在一個程序中,如果開闢了多少執行緒,執行緒的執行由排程器安排排程,排程器是與作業系統緊密相關的,先後順序是不能認為的干預的。 對同一份資源操作時,會存在資源搶奪的問題,需要加入併發控制 每個執行緒在自己的工作記憶體互動,記憶體控制不會造成吧資料不一致。 三.怎樣實現多執行緒? 1.繼承Thread類實現多執行緒的能力 ``` package com.kuang.demo1; //建立Thread類 重寫run()方法 呼叫start()方法 //執行緒開始不一定立即執行,由CPU執行 public class TestThread1 extends Thread{ @Override public void run() { //run()方法執行緒 for(int i=0;i<20;i++) { System.out.println("我愛寫程式碼--" +i); } } public static void main(String[] args) { //main執行緒 主執行緒 //建立一個執行緒 TestThread1 testThread1 = new TestThread1(); //呼叫start()方法開啟執行緒 testThread1.start(); for(int i=0;i<20;i++) { System.out.println("我愛學習多執行緒" + i); } } } ``` 2.實現Runnable介面建立多執行緒 ``` package com.kuang.demo1; //建立執行緒的第二種 首先實現runnable介面,接著重寫run()方法,執行執行緒時需要丟入runnable介面實現類,呼叫start方法 public class TestThread2 implements Runnable{ @Override public void run() { //run方法執行緒體 for(int i=0;i<20;i++) { System.out.println("我在看程式碼--" + i); } } public static void main(String [] args) { //建立runnable實現介面類的執行緒 TestThread2 testThread2 = new TestThread2(); new Thread(testThread2).start(); for(int i=0;i<20;i++) { System.out.println("我在學習多執行緒--" + i); } } } ``` 3.實現Callable介面(這個我就不舉程式碼例子了,瞭解即可) ``` 1.實現Callable介面,需要返回值型別 2.重寫call方法,需要丟擲異常 3.建立目標物件 4.建立執行服務:ExecutorService ser = Excutors.newFixedThreadPool(1); 5.提交執