多線程與高并發(fā)

@[TOC](多線程與高并發(fā))

# 認識并發(fā)與并行

并發(fā)是針對一個CPU來講忠烛,“同一時間”執(zhí)行多個任務--實質上是劃分時間片,由于時間很短給人的感覺是是同時執(zhí)行的冰沙;

并行是針對多個CPU來講的,同時執(zhí)行多個任務(一個CPU執(zhí)行一個),這是真正意義上的同時執(zhí)行叼屠;

## 入門程序分析(打印---HelloWorld)

```java

class Car{

? ? public void drive(){

? ? ? ? System.out.println("我會跑");

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? Car car=null;

? ? ? ? System.out.println("HelloWorld");//主線程---main()

? ? ? ? car.drive();//異常處理的線程---

? ? ? ? new Car().drive();//運行完畢,new Car()匿名對象會被回收--垃圾收集器

? ? }

}

```

![在這里插入圖片描述](https://img-blog.csdnimg.cn/f04626e9ef4b4676a6b14462936d67f9.png)所以在我們初學java時绞铃,并非只有一個線程镜雨,其實是多線程的包括? 主線程、處理異常的線程儿捧,以及垃圾收集器線程等等冷离;

### 線程之間是如何搶占CPU資源的?

先來看一個案例----

![在這里插入圖片描述](https://img-blog.csdnimg.cn/578e547affb14c3bb890d75f8046680d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70#pic_center)當我們打開一個程序前纯命,其實就是存放在電腦中的代碼(靜態(tài)的)西剥,打開之后,這個程序才算開啟亿汞,(為他分配空間以及CPU資源)瞭空,然后在這個程序中開啟不同的功能--即開啟了多個線程,然后CPU再次為這些線程服務疗我,如果線程過多咆畏,CPU不夠用,那就會使得一個CPU要執(zhí)行多個線程---形成了并發(fā)(采用時間片機制)吴裤,同時可以為線程設置優(yōu)先級來提高相應線程被先執(zhí)行的概率(并不是優(yōu)先級低就一定會被后執(zhí)行)

### 自定義線程的執(zhí)行

線程的創(chuàng)建方式---

第一種---繼承Thread類

```java

class Car extends? Thread{

? ? @Override

? ? public void run(){

? ? ? ? for (int i=0;i<10;i++){

? ? ? ? System.out.println("我會跑");}

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? //主線程---main()

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println("HelloWorld"+i);

? ? ? ? }

? ? new Car().run();

? ? }

}

```

這一種并不是多線程旧找,因為該方式只是把run()當成一個普通方法來執(zhí)行的;麦牺,所以運行結果是 先執(zhí)行main--主線程钮蛛,然后執(zhí)行run()鞭缭,此時run也是屬于主線程里面的;

![在這里插入圖片描述](https://img-blog.csdnimg.cn/caeb286452dd4685bcc427aa7f7036db.png)

```java

class Car extends? Thread{

? ? @Override

? ? public void run(){

? ? ? ? for (int i=0;i<10;i++){

? ? ? ? System.out.println("我會跑");}

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? //主線程---main()

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println("HelloWorld"+i);

? ? ? ? }

? ? new Car().start();

? ? }

}

```

start()是父類的方法魏颓,但是與逆行結果依然跟上面一樣---

![在這里插入圖片描述](https://img-blog.csdnimg.cn/6195a0123dce47bc9caeaa82b0875ff5.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)原因是我們在主線程(for循環(huán))執(zhí)行時并沒有子線程參與進來岭辣,要想實現(xiàn)并發(fā)效果需要調整一下start()方法的位置--

```java

class Car extends? Thread{

? ? @Override

? ? public void run(){

? ? ? ? for (int i=0;i<10;i++){

? ? ? ? System.out.println("我會跑"+i);}

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? //子線程

? ? ? ? new Car().start();

? ? ? ? //主線程---main()

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println("HelloWorld"+i);

? ? ? ? }

? ? }

}

```

![在這里插入圖片描述](https://img-blog.csdnimg.cn/9145df3672f64465993a8cdd6e5326b5.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

> 運行后發(fā)現(xiàn)---有時候并不一定會出現(xiàn)并發(fā)---當運行量少的時候;

# 為線程設置名字和獲取線程名字

```java

public class Car extends? Thread{

? ? @Override

? ? public void run(){

? ? ? ? for (int i=0;i<10;i++){

? ? ? ? ? ? System.out.println(this.getName()+i);}

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? //子線程

? ? ? ? ? ? Car car= new Car();

? ? ? ? ? ? car.setName("小汽車");

? ? ? ? car.start();

? ? ? ? //主線程---main()

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println(Thread.currentThread().getName()+i);

? ? ? ? }

? ? }

}

```

![在這里插入圖片描述](https://img-blog.csdnimg.cn/8018216a7101479891c210510f6a0ea3.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

還可以通過構造器來設置線程名字---

```java

public class Car extends? Thread{

? ? public Car(String name){

? ? ? ? super(name);

? ? }

? ? @Override

? ? public void run(){

? ? ? ? for (int i=0;i<10;i++){

? ? ? ? ? ? System.out.println(this.getName()+i);}

? ? }

}

public class HuiXinThread {

? ? public static void main(String[] args) {

? ? ? ? //子線程

? ? ? ? ? ? Car car= new Car("小火車");

? ? ? ? ? ? //car.setName("小汽車");

? ? ? ? car.start();

? ? ? ? //主線程---main()

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println(Thread.currentThread().getName()+i);

? ? ? ? }

? ? }

}

```

![在這里插入圖片描述](https://img-blog.csdnimg.cn/55f6ba64fdd7420a9f09c06638b05af2.png)

設置線程名的父類構造方法---

![在這里插入圖片描述](https://img-blog.csdnimg.cn/1d470a6200734ac0a083cb6a36a8df6e.png)

# 線程開啟的方式---

## 繼承Thread類--

演示代碼如上甸饱,不在贅述----注意點為? 開啟線程是start()方法沦童,而run()方法還是當作一個普通方法來處理的;

start()源碼---

> 此方法不為主方法線程或“系統(tǒng)”調用叹话。?

> 虛擬機創(chuàng)建/設置的組線程偷遗。 添加的新功能?

> 到這個方法以后可能還需要添加到VM中。

![在這里插入圖片描述](https://img-blog.csdnimg.cn/f66733f94539419ea0f14108c96632e7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

## 實現(xiàn)Runable接口

```java

class BuyBook implements Runnable{

? ? @Override

? ? public void run() {

? ? ? ? for (int i = 0; i < 10; i++) {

? ? ? ? ? ? System.out.println("i---"+Thread.currentThread());

? ? ? ? }

? ? }

}

public class Test {

? ? public static void main(String[] args)? {

? ? ? ? BuyBook bb= new BuyBook();

? ? ? ? bb.run();

? ? ? ? for (int i = 0; i <10 ; i++) {

? ? ? ? ? ? System.out.println("i---"+Thread.currentThread());

? ? ? ? }

? ? }

}

```

![在這里插入圖片描述](https://img-blog.csdnimg.cn/722edded37734ceda44008f97eb42cce.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

> Runnable接口中只有一個run方法,

![在這里插入圖片描述](https://img-blog.csdnimg.cn/582525a34919410288ed0d6c325ad153.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

并沒有發(fā)現(xiàn)start方法,需要怎么做呢?

start()方法在Thread類中,所以要先在創(chuàng)建一個Thread的對象

```java

class BuyBook implements Runnable{

? ? @Override

? ? public void run() {

? ? ? ? for (int i = 0; i < 3; i++) {

? ? ? ? ? ? System.out.println("i---"+Thread.currentThread());

? ? ? ? }

? ? }

}

public class Test {

? ? public static void main(String[] args)? {

? ? ? ? Thread.currentThread().setName("主線程");

? ? ? ? BuyBook bb= new BuyBook();

? ? ? ? Thread thread= new Thread(bb);

? ? ? ? thread.setName("子線程");

? ? ? ? thread.start();

? ? ? ? for (int i = 0; i <3 ; i++) {

? ? ? ? ? ? System.out.println("i---"+Thread.currentThread());

? ? ? ? }

? ? }

}

```

> public Thread(Runnable target) {//構造器--傳入的是Runnable對象

? ? ? ? this(null, target, "Thread-" + nextThreadNum(), 0);

? ? }

當處理量少的時候得到的結果像是順序執(zhí)行的,多運行幾次就可以了;

![在這里插入圖片描述](https://img-blog.csdnimg.cn/d81146f50cd84580818ad686c696239d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDA2MTMzMw==,size_16,color_FFFFFF,t_70)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末驼壶,一起剝皮案震驚了整個濱河市鹦肿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辅柴,老刑警劉巖箩溃,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碌嘀,居然都是意外死亡涣旨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門股冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霹陡,“玉大人,你說我怎么就攤上這事止状∨朊蓿” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵怯疤,是天一觀的道長浆洗。 經常有香客問我,道長集峦,這世上最難降的妖魔是什么伏社? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮塔淤,結果婚禮上摘昌,老公的妹妹穿的比我還像新娘。我一直安慰自己高蜂,他們只是感情好聪黎,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著备恤,像睡著了一般稿饰。 火紅的嫁衣襯著肌膚如雪锦秒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天湘纵,我揣著相機與錄音脂崔,去河邊找鬼滤淳。 笑死梧喷,一個胖子當著我的面吹牛,可吹牛的內容都是我干的脖咐。 我是一名探鬼主播铺敌,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屁擅!你這毒婦竟也來了偿凭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤派歌,失蹤者是張志新(化名)和其女友劉穎弯囊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胶果,經...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡匾嘱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了早抠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎烙。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蕊连,靈堂內的尸體忽然破棺而出悬垃,到底是詐尸還是另有隱情,我是刑警寧澤甘苍,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布尝蠕,位于F島的核電站,受9級特大地震影響载庭,放射性物質發(fā)生泄漏趟佃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一昧捷、第九天 我趴在偏房一處隱蔽的房頂上張望闲昭。 院中可真熱鬧,春花似錦靡挥、人聲如沸序矩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簸淀。三九已至瓶蝴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間租幕,已是汗流浹背舷手。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劲绪,地道東北人男窟。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像贾富,于是被迫代替她去往敵國和親歉眷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內容

  • “高并發(fā)和多線程”總是被一起提起颤枪,給人感覺兩者好像相等汗捡,實則高并發(fā) ≠ 多線程 多線程是完成任務的一種方法,高并發(fā)...
    程序大視界閱讀 478評論 0 1
  • 場景:進屋排隊打印東西 可重入鎖:排隊拿到打印權(鑰匙),開門開鎖盗胀,打印完畢艘蹋,關門,打算交鑰匙读整,同學打電話給來簿训,幫...
    青城樓主閱讀 1,282評論 0 1
  • 多線程與高并發(fā)編程(一) 什么叫線程,進程,協(xié)程?一個程序啟動起來叫做進程,可以理解為動態(tài)的程序,線程是一個進程的...
    woaihuoguoooo閱讀 167評論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭米间,有人歡樂有人憂愁强品,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,545評論 28 53
  • 人工智能是什么屈糊?什么是人工智能的榛?人工智能是未來發(fā)展的必然趨勢嗎?以后人工智能技術真的能達到電影里機器人的智能水平嗎...
    ZLLZ閱讀 3,788評論 0 5