談談java中的併發(一)
阿新 • • 發佈:2020-06-22
一.併發的定義
併發:對於這個概念一直就是沒怎麼搞懂,就是感覺特別的生疏,(自己從從字面上理解就是多個東西,一起出發),所以就上網上查了一些資料:
同時擁有兩個或多個執行緒,如果程式在單核處理器上執行,多個執行緒將交替地換入或者換出記憶體,這些執行緒是同時“存在”的,每個執行緒都處於執行過程中的某個狀態,如果執行在多核處理器上,此時,程式中的每個執行緒都將分配到一個處理器核上,因此可以同時執行。
高併發(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.提交執