国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

拜托!別再問我多線程的這些問題了

網絡 通信技術
很多同學面對多線程的問題都很頭大,因為自己做項目很難用到,但是但凡高薪的職位面試都會問到。。畢竟現在大廠里用的都是多線程高并發,所以這塊內容不吃透肯定是不行的。

[[340332]]

本文轉載自微信公眾號「碼農田小齊」,作者小齊本齊 。轉載本文請聯系碼農田小齊公眾號。  

很多同學面對多線程的問題都很頭大,因為自己做項目很難用到,但是但凡高薪的職位面試都會問到。。畢竟現在大廠里用的都是多線程高并發,所以這塊內容不吃透肯定是不行的。

今天這篇文章,作為多線程的基礎篇,先來談談以下問題:

  • 為什么要用多線程?
  • 程序 vs 進程 vs 線程
  • 創建線程的 4 種方式?

為什么要用多線程

任何一項技術的出現都是為了解決現有問題。

之前的互聯網大多是單機服務,體量小;而現在的更多是集群服務,同一時刻有多個用戶同時訪問服務器,那么會有很多線程并發訪問。

比如在電商系統里,同一時刻比如整點搶購時,大量用戶同時訪問服務器,所以現在公司里開發的基本都是多線程的。

使用多線程確實提高了運行的效率,但與此同時,我們也需要特別注意數據的增刪改情況,這就是線程安全問題,比如之前說過的 HashMap vs HashTable,Vector vs ArrayList。

要保證線程安全也有很多方式,比如說加鎖,但又可能會出現其他問題比如死鎖,所以多線程相關問題會比較麻煩。

因此,我們需要理解多線程的原理和它可能會產生的問題以及如何解決問題,才能拿下高薪職位。

進程 vs 線程

程序program

說到進程,就不得不先說說程序。

程序,說白了就是代碼,或者說是一系列指令的集合。比如「微信.exe」這就是一個程序,這個文件最終是要拿到 CPU 里面去執行的。

進程 process

當程序運行起來,它就是一個進程。

所以程序是“死”的,進程是“活”的。

比如在任務管理器里的就是一個個進程,就是“動起來”的應用程序。

 

Q:這些進程是并行執行的嗎?

單核 CPU 一個時間片里只能執行一個進程。但是因為它切換速度很快,所以我們感受不到,就造成了一種多進程的假象。(多核 CPU 那真的就是并行執行的了。)

Q:那如果這個進程沒執行完呢?

當進程 A 執行完一個時間片,但是還沒執行完時,為了方便下次接著執行,要保存剛剛執行完的這些數據信息,叫做「保存現場」。

然后等下次再搶到了資源執行的時候,先「恢復現場」,再開始繼續執行。

這樣循環往復。。

這樣反復的保存啊、恢復啊,都是額外的開銷,也會讓程序執行變慢。

Q:有沒有更高效的方式呢?

如果兩個線程歸屬同一個進程,就不需要保存、恢復現場了。

這就是 NIO 模型的思路,也是 NIO 模型比 BIO 模型效率高很多的原因,我們之后再講。

線程 thread

線程,是一個進程里的具體的執行路徑,就是真正干活的。

在一個進程里,一個時間片也只能有一個線程在執行,但因為時間片的切換速度非常快,所以看起來就好像是同時進行的。

一個進程里至少有一個線程。比如主線程,就是我們平時寫的 main() 函數,是用戶線程;還有 gc 線程是 JVM 生產的,負責垃圾回收,是守護線程。

 

每個線程有自己的棧 stack,記錄該線程里面的方法相互調用的關系;

但是一個進程里的所有線程是共用堆 heap 的。

那么不同的進程之間是不可以互相訪問內存的,每個進程有自己的內存空間 memeory space,也就是虛擬內存 virtual memory。

通過這個虛擬內存,每一個進程都感覺自己擁有了整個內存空間。

虛擬內存的機制,就是屏蔽了物理內存的限制。

Q:那如果物理內存被用完了呢?

用硬盤,比如 windows 系統的分頁文件,就是把一部分虛擬內存放到了硬盤上。

相應的,此時程序運行會很慢,因為硬盤的讀寫速度比內存慢很多,是我們可以感受到的慢,這就是為什么開多了程序電腦就會變卡的原因。

Q:那這個虛擬內存是有多大呢?

對于 64 位操作系統來說,每個程序可以用 64 個二進制位,也就是 2^64 這么大的空間!

如果還不清楚二進制相關內容的,公眾號內回復「二進制」獲取相應的文章哦~

總結

總結一下,在一個時間片里,一個 CPU 只能執行一個進程。

CPU 給某個進程分配資源后,這個進程開始運行;進程里的線程去搶占資源,一個時間片就只有一個線程能執行,誰先搶到就是誰的。

 

多進程 vs 多線程

每個進程是獨立的,進程 A 出問題不會影響到進程 B;

雖然線程也是獨立運行的,但是一個進程里的線程是共用同一個堆,如果某個線程 out of memory,那么這個進程里所有的線程都完了。

所以多進程能夠提高系統的容錯性 fault tolerance ,而多線程最大的好處就是線程間的通信非常方便。

進程之間的通信需要借助額外的機制,比如進程間通訊 interprocess communication -IPC,或者網絡傳遞等等。

如何創建線程

上面說了一堆概念,接下來我們看具體實現。

Java 中是通過 java.lang.Thread 這個類來實現多線程的功能的,那我們先來看看這個類。

從文檔中我們可以看到,Thread 類是直接繼承 Object 的,同時它也是實現了 Runnable 接口。

官方文檔里也寫明了 2 種創建線程的方式:

一種方式是從 Thread 類繼承,并重寫 run(),run() 方法里寫的是這個線程要執行的代碼;

啟動時通過 new 這個 class 的一個實例,調用 start() 方法啟動線程。

 

二是實現 Runnable 接口,并實現 run(),run() 方法里同樣也寫的是這個線程要執行的代碼;

稍有不同的是啟動線程,需要 new 一個線程,并把剛剛創建的這個實現了 Runnable 接口的類的實例傳進去,再調用 start(),這其實是代理模式。

 

如果面試官問你,還有沒有其他的,那還可以說:

實現 Callable 接口;

通過線程池來啟動一個線程。

但其實,用線程池來啟動線程時也是用的前兩種方式之一創建的。

這兩種方式在這里就不細說啦,我們具體來看前兩種方式。

繼承 Thread 類

  1. public class MyThread extends Thread { 
  2.     @Override 
  3.     public void run() { 
  4.         for (int i = 0; i < 100; i++) { 
  5.             System.out.println("小齊666:" + i); 
  6.         } 
  7.     } 
  8.     public static void main(String[] args) { 
  9.         MyThread myThread = new MyThread(); 
  10.         myThread.start(); 
  11.         for (int i = 0; i < 100; i++) { 
  12.             System.out.println("主線程" + i + ":齊姐666"); 
  13.         } 
  14.     } 

在這里,

  • main 函數是主線程,是程序的入口,執行整個程序;
  • 程序開始執行后先啟動了一個新的線程 myThread,在這個線程里輸出“小齊”;
  • 主線程并行執行,并輸出“主線程i:齊姐”。

 

來看下結果,就是兩個線程交替夸我嘛~

 

Q:為啥和我運行的結果不一樣?

多線程中,每次運行的結果可能都會不一樣,因為我們無法人為控制哪條線程在什么時刻先搶到資源。

當然了,我們可以給線程加上優先級 priority,但高優先級也無法保證這條線程一定能先被執行,只能說有更大的概率搶到資源先執行。

實現 Runnable 接口

這種方式用的更多。

  1. public class MyRunnable implements Runnable { 
  2.     @Override 
  3.     public void run() { 
  4.         for(int i = 0; i < 100; i++) { 
  5.             System.out.println("小齊666:" + i); 
  6.         } 
  7.     } 
  8.  
  9.     public static void main(String[] args) { 
  10.         new Thread(new MyRunnable()).start(); 
  11.  
  12.         for(int i = 0; i < 100; i++) { 
  13.             System.out.println("主線程" + i + ":齊姐666"); 
  14.         } 
  15.     } 

結果也差不多:

 

像前文所說,這里線程啟動的方式和剛才的稍有不同,因為新建的的這個類只是實現了 Runnable 接口,所以還需要一個線程來“代理”執行它,所以需要把我們新建的這個類的實例傳入到一個線程里,這里其實是代理模式。這個設計模式之后再細講。

小結

那這兩種方式哪種好呢?

使用 Runnable 接口更好,主要原因是 Java 單繼承。

另外需要注意的是,在啟動線程的的時候用的是 start(),而不是 run()。

調用 run() 僅僅是調用了這個方法,是普通的方法調用;而 start() 才是啟動線程,然后由 JVM 去調用該線程的 run() 。

 

好了,以上就是多線程第一篇的所有內容了,這里主要是幫助大家復習一下基礎概念,以及沒有接觸過多線程的小伙伴可以入門。想看更多關于多線程的文章的話,記得給我點贊留言哦~

 

責任編輯:武曉燕 來源: 碼農田小齊
相關推薦

2018-09-28 05:25:53

TopK算法代碼

2020-04-22 11:19:07

貪心算法動態規劃

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計數排序排序面試

2018-11-06 11:40:19

時間復雜度面試算法

2021-01-22 10:09:23

簡歷求職者面試

2020-03-30 17:20:54

B+樹SQL索引

2019-04-16 13:30:05

表達式求值數據結構算法

2019-01-08 15:11:50

最大值最小值算法

2022-03-14 10:14:43

底層系統Nacos

2019-08-29 09:49:50

2020-12-11 09:24:19

Elasticsear存儲數據

2018-11-09 09:34:05

面試Spring Clou底層

2020-09-24 14:40:55

Python 開發編程語言

2015-02-13 10:42:31

前端工具Dreamweaver

2020-04-16 08:22:11

HTTPS加解密協議

2019-07-10 10:06:24

面試官三次握手四次揮手

2019-12-17 09:29:02

數據庫架構分庫分表

2020-11-02 11:21:35

Python編輯器代碼

2019-03-12 14:48:29

路由器XBOXPS4
點贊
收藏

51CTO技術棧公眾號

天堂va欧美ⅴa亚洲va一国产| 污片在线免费看| 老司机在线看片网av| 成+人+亚洲+综合天堂| 情事1991在线| av剧情在线观看| 欧美性猛交xxxx乱大交| 色七七在线观看| 蜜桃av一区二区在线观看 | 视频一区国产精品| 婷婷丁香综合| 亚洲视频国产| 欧美大尺度激情区在线播放| 国产中文在线播放| 亚洲第一福利在线观看| 麻豆av在线免费观看| 国产91精品入口17c| xxxx日韩| 精品国产自在精品国产浪潮 | 奇米影视在线99精品| 97人人做人人人难人人做| 精品国产一区探花在线观看 | 日韩高清欧美| 91亚色免费| 欧美伊人久久| 91青青草免费观看| 亚洲电影av| 欧美黄色直播| 九一九一国产精品| 亚洲人成小说网站色在线| 久久亚洲天堂| 欧美撒尿777hd撒尿| 午夜免费视频在线国产| 欧美日韩另类国产亚洲欧美一级| 国产精品香蕉av| 亚洲私拍自拍| 一区二区成人国产精品| 91在线免费播放| 最近中文字幕2019第二页视频| 亚洲国产sm捆绑调教视频| 麻豆网在线观看| 亚洲欧美中文另类| 亚洲免费观看高清完整版在线观| 91久久精品日日躁夜夜躁国产| 日韩高清在线不卡| 91av俱乐部| 日韩欧美一级在线播放| 欧美三级电影在线| 久久久久久国产精品免费免费| 不卡一区在线观看| 国产高清免费av在线| 色婷婷综合久久久久中文字幕1| 国产精品区一区| 国产精一品亚洲二区在线视频| 人成网站免费观看| 日韩欧美久久久| 久久国产电影| 超碰影院在线观看| 日韩精品中文字幕在线不卡尤物| 欧美亚洲色图校园春色| 视频一区二区三| 日韩欧美主播在线| 要久久爱电视剧全集完整观看| 超碰人人爱人人| 91精品国产aⅴ一区二区| 欧美电影《睫毛膏》| 免费成人看片| 欧美裸身视频免费观看| 欧美aaa在线| 日韩电影网址| 国产在线观看不卡| 亚洲激情av在线| 成人动漫视频| 日本免费观看网站| 欧美成人高清视频| 久久久久久久久久久久久夜| 视频一区在线免费看| 久久久性生活视频| 永久免费毛片在线播放不卡| 激情欧美日韩一区二区| 欧美大片免费观看网址| 日韩中文字幕亚洲精品欧美| 日韩毛片中文字幕| 精品一区二区三区日韩| 成人午夜一级| 哪个网站能看毛片| 91精品国产91久久久久久密臀 | 国产视频一二三区| 日本一区二区三区在线播放| 亚洲欧美一区二区久久| 欧美日韩一区二区综合| 欧美写真视频一区| 5566av亚洲| 日韩久久久久久| 成人手机电影网| 成人亚洲一区二区| 很黄的网站在线观看| 一区二区av| 久久亚洲国产精品| 午夜精品国产更新| 久久精品国产99| 日韩在线免费| 性视频在线播放| 免费亚洲一区二区| 日韩最新在线视频| 亚洲国产你懂的| 久久er精品视频| 久久精品国产99久久| 亚洲十八**毛片| 992tv在线观看| 国产xxxx振车| caoporen国产精品| 欧美激情一级精品国产| 日韩视频国产视频| 亚洲成av人在线观看| 国产成人一级电影| 综合激情在线| 欧美美女啪啪| 日韩欧美一区二区三区在线观看 | 3d精品h动漫啪啪一区二区| 一区二区欧美日韩视频| 91福利在线看| 99这里都是精品| 久久高清一区| 国产精品theporn| 欧美日韩国产一区二区三区不卡| 中文一区一区三区高中清不卡免费| 手机看片福利在线观看| 色婷婷亚洲十月十月色天| 日本一级黄视频| 亚洲成色最大综合在线| 99精品99久久久久久宅男| 国产成人精品免费视频| 韩国日本不卡在线| 日本韩国在线不卡| 国产精品2018| 国产成人精品网站| 欧美中文字幕精品| 国产精品福利在线观看| 日韩av大片在线| 日本久久久久久久久久久| 欧美中文字幕精品| 国产精品成人va在线观看| 国产精品日韩av| 成人看片人aa| 国产精品二区二区三区| 加勒比在线一区二区三区观看| 九九九九九九精品| 日韩精品一区二区三区色偷偷| 国精产品一区二区| 久久视频免费在线| 黄色动漫在线免费看| 丝袜足控免费网站xx网站| 日韩私人影院| 男女免费观看在线爽爽爽视频| 免费h视频在线观看| 97久久亚洲| 禁果av一区二区三区| 韩国亚洲精品| 久久精品国产久精国产爱| 欧美国产欧美综合| 性久久久久久久久久久久| 欧美丰满高潮xxxx喷水动漫| 亚洲欧美日韩国产成人| 欧美一区二区三区免费观看| 99www免费人成精品| 欧美亚洲黄色片| 亚洲综合色视频在线观看| www.8ⅹ8ⅹ羞羞漫画在线看| 成年无码av片在线| 日产日韩在线亚洲欧美| 国内外成人激情视频| 韩日午夜在线资源一区二区| 国产精品视频午夜| 国产综合在线观看视频| 国产免费一区二区| 亚洲啊啊啊啊啊| 日本在线观看免费| 少妇精品视频一区二区免费看| 成人短视频在线| 亚洲ww精品| 91精品短视频| 国产不卡一区| 99国产精品久久久久久久| 99久久伊人网影院| 亚洲激情视频网站| 欧美日韩国产一二三| 亚洲高清久久网| 日本久久精品视频| 亚洲一区二区三区午夜| 欧美wwwwwww| 不卡福利视频| 国产精品mv在线观看| 99热99精品| 欧美不卡在线视频| 美女扒开腿让男人桶爽久久动漫| 精品91在线| 国产.精品.日韩.另类.中文.在线.播放 | 国产欧美日韩三区| 亚洲影视一区|