在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

軟件大師開小灶:線程和線程池

Linux閱碼場 ? 來源:未知 ? 作者:胡薇 ? 2018-05-18 11:06 ? 次閱讀

大師,最近我在學習線程,有很多迷惑的地方。

說來聽聽,讓為師給你排解一下。

第一個問題問題就是為什么要多線程啊, 我看了操作系統中的多進程管理,不是挺好的嗎? 多線程似乎沒有必要啊!

不錯,多問問為什么,總是有好處的。所謂線程,就是程序代碼的執行,一個進程至少得有一個線程,要不然,這個進程怎么運行? 對吧?

這個我理解。

以你常用的Word為例,假設這個進程沒有多線程(或者說它只有一個線程), 如果它有個定時保存文檔的功能,你想象下,當這個自動保存的功能在運行的時候,你還能繼續輸入文字嗎?

不能

對,這就是問題所在了,單線程只能干一件事情,無法并發和并行。直接導致用戶體驗不好。CPU快速的運算能力,還有多核,就被浪費了。

那我完全可以用多進程來處理啊, 一個進程來接受用戶輸入文字,另外一個進程來自動保存。

是可以這么做,但進程是個重量級的家伙,并且進程之間是隔離的,他們要想共享數據,例如被編輯的文件內容,那是非常麻煩的。

原來如此。

古人云:進程是擁有資源的基本單位, 線程是CPU調度的基本單位,這句話你理解嗎?

不是特別明白......

舉個例子,有兩個進程,一個是Word, 一個是QQ音樂。 Word 進程打開了文件,這是它的資源,QQ音樂打開了Socket,這也是它的資源。

假設Word有兩個線程:T1負責接受用戶的文字輸入,T2 負責自動保存。

QQ音樂也有兩個線程:T3負責從Socket中讀取數據,T4負責對音樂數據進行解碼。

操作系統在做調度的時候,基本單位不是Word,QQ音樂這樣的進程,而是T1, T2,T3,T4這些線程。明白了嗎?

(點頭)原來每個線程執行的都是進程代碼的某個片段啊! 對了,我聽師兄們在討論什么Java多線程編程,說是很復雜,但是他們從來沒提到過Java 多進程編程,這是怎么回事啊?

不錯,你的師兄們都沒有想到這個問題,看來你已經開始思考了。我先問你,你寫的Java程序是不是運行在JVM中? 對操作系統來說,JVM是個什么東西?

嗯... JVM其實就是java.exe運行起來,那它肯定是個進程了。

那在一個進程中還能進行多進程編程嗎?

(恍然大悟)奧,那是肯定不行了,Java程序運行在JVM當中, JVM這個進程其實就是他們的容器。 我聽說Python, Ruby 等動態語言也都有虛擬機, 這么說他們也可以進行多線程編程了。

是啊,虛擬機是個好東西,你們真是遇上了好時候啊, 不用再費勁心機去操作內存。這虛擬機還能屏蔽操作系統的差異,你寫的程序可以在任意的支持該語言虛擬機的操作系統中運行。 可移植性很重要,要不然,你在Mac/Windows上開發的程序怎么能不加修改地放到Linux上去運行呢?

我在Java 中創建了一個Thread對象,為什么要調用start方法才能啟動線程? 為什么不能直接調用run方法呢?

你要是直接調用run()方法,會是什么效果?

就是用當前線程去執行一個普通函數而已,根本沒有什么新線程創建出來。

這就對了,你想創建一個新的線程出來,肯定得有準備工作啊,設置好這個線程的上下文,比如這個線程的棧(用于函數調用),線程的狀態,這個線程的PC(Program Counter)等等一系列信息以后,這個線程才可以被調度, 一旦被調度,就會執行那個run()方法了

明白了大師,還有一個問題,既然線程是屬于進程的,可以共享進程的資源, 那創建一個線程應該很輕松啊,為什么要有線程池這個東西呢?

雖然線程是個輕量級的東西, 但是對于互聯網應用來說,如果每個用戶的請求都創建一個線程,那會非常得多,服務器也是難于承受, 再說了,眾多的線程去競爭CPU,不斷切換,也會讓CPU調度不堪重負,很多線程將不得不等待。所以前輩們的思路就是(1)用少量的線程 (2) 讓線程保持忙碌

奧,就是說只創建一定數量的線程,讓這些線程去處理所有的任務,任務執行完了以后,線程并不結束,而是回到線程池中去,等待接受下一個任務。

這些線程可以預先創建,任務來了就不用臨時再創建了,立刻開始服務。

預先創建? 您剛才不是說線程是程序代碼的執行嗎? 它是個動態的東西,怎么可能預先創建? 如果真的創建起來了,就會調用run方法, 馬上執行完了, 線程就結束了!

你忘了重要的一點,線程的狀態。當線程池的線程剛創建時,讓他們進入阻塞狀態:等待某個任務的到來。 如果任務來了,那就好辦,喚醒其中一個線程,讓它拿到任務去執行即可。

可是怎么讓他們進入阻塞狀態?

看來之前的圖我白畫了, BlockingQueue聽說過沒有? 沒聽說過? 其實很簡單,就是一個線程調用它的take()方法取數據時, 如果這個Queue中沒有數據,該線程會阻塞;同樣,一個線程調用它的put方法放數據時,如果Queue滿了, 也會阻塞。

奧,看來線程池中每個線程的run()方法中,要設置一個循環,每次都嘗試從BlockingQueue中獲取任務,如果Queue是空的,就阻塞等待, 如果有任務來了,就會通知到線程池的某一個線程去處理,處理完了以后,依然試圖從BlockingQueue中獲取任務,就這么依次循環下去。

線程池中的Worker線程:public class WorkerThread extends Thread { private BlockingQueue taskQueue = null; private boolean isStopped = false; //持有一個BlockingQueue的實例 public WorkerThread(BlockingQueue queue){ taskQueue = queue; } public void run(){ while(!isStopped()){ try{ Task task = taskQueue.take(); task.execute(); } catch(Exception e){ //log or otherwise report exception, //but keep pool thread alive. } } } ......略......}

沒錯,你這個代碼是一種簡單的實現,我的老朋友Doug Lea大師寫了一套非常好的實現,已經被吸收進JDK了,作為java.util.concurrent包的一部分,你直接調用即可,不用自己動手了。

ExecutorService executorService = Executors.newFixedThreadPool(10);executorService.execute(new Runnable() { public void run() { System.out.println("Asynchronous task"); }});executorService.shutdown();

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 線程池
    +關注

    關注

    0

    文章

    57

    瀏覽量

    6898
  • 線程
    +關注

    關注

    0

    文章

    507

    瀏覽量

    19766

原文標題:小白科普:線程和線程池

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    跨平臺的線程組件--TP組件

    /銷毀代價是很高的。那么我們要怎么去設計多線程編程呢???答案:對于長駐的線程,我們可以創建獨立的線程去執行。但是非長駐的線程,我們可以通過線程
    的頭像 發表于 04-06 15:39 ?927次閱讀

    Java中的線程包括哪些

    線程是用來統一管理線程的,在 Java 中創建和銷毀線程都是一件消耗資源的事情,線程可以重復
    的頭像 發表于 10-11 15:33 ?869次閱讀
    Java中的<b class='flag-5'>線程</b><b class='flag-5'>池</b>包括哪些

    線程是如何實現的

    線程的概念是什么?線程是如何實現的?
    發表于 02-28 06:20

    基于線程技術集群接入點的應用研究

    本文在深入研究高級線程技術的基礎上,分析、研究了固定線程數目的線程線程數目動態變化的
    發表于 01-22 14:21 ?5次下載

    java自帶的線程方法

    二、原理分析 從上面使用線程的例子來看,最主要就是兩步,構造ThreadPoolExecutor對象,然后每來一個任務,就調用ThreadPoolExecutor對象的execute方法。 1
    發表于 09-27 11:06 ?0次下載

    基于Nacos的簡單動態化線程實現

    本文以Nacos作為服務配置中心,以修改線程核心線程數、最大線程數為例,實現一個簡單的動態化線程
    發表于 01-06 14:14 ?895次閱讀

    線程線程

    線程通常用于服務器應用程序。 每個傳入請求都將分配給線程池中的一個線程,因此可以異步處理請求,而不會占用主線程,也不會延遲后續請求的處理
    的頭像 發表于 02-28 09:53 ?850次閱讀
    多<b class='flag-5'>線程</b>之<b class='flag-5'>線程</b><b class='flag-5'>池</b>

    Java線程核心原理

    看過Java線程源碼的小伙伴都知道,在Java線程池中最核心的類就是ThreadPoolExecutor,
    的頭像 發表于 04-21 10:24 ?921次閱讀

    線程線程怎么釋放

    線程分組看,pool名開頭線程占616條,而且waiting狀態也是616條,這個點就非常可疑了,我斷定就是這個pool開頭線程導致的問題。我們先排查為何這個
    發表于 07-31 10:49 ?2353次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的<b class='flag-5'>線程</b>怎么釋放

    Spring 的線程應用

    我們在日常開發中,經常跟多線程打交道,Spring 為我們提供了一個線程方便我們開發,它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程
    的頭像 發表于 10-13 10:47 ?659次閱讀
    Spring 的<b class='flag-5'>線程</b><b class='flag-5'>池</b>應用

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優勢 C++線程簡介
    的頭像 發表于 11-10 10:24 ?601次閱讀

    線程的基本概念

    線程的基本概念 不管線程是什么東西!但是我們必須知道線程被搞出來的目的就是:提高程序執行效
    的頭像 發表于 11-10 16:37 ?576次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的基本概念

    線程七大核心參數執行順序

    線程是一種用于管理和調度線程執行的技術,通過將任務分配到線程池中的線程進行處理,可以有效地控制并發線程
    的頭像 發表于 12-04 16:45 ?1160次閱讀

    線程的創建方式有幾種

    線程是一種用于管理和調度線程的技術,能夠有效地提高系統的性能和資源利用率。它通過預先創建一組線程并維護一個工作隊列,將任務提交給線程
    的頭像 發表于 12-04 16:52 ?946次閱讀

    什么是動態線程?動態線程的簡單實現思路

    因此,動態可監控線程一種針對以上痛點開發的線程管理工具。主要可實現功能有:提供對 Spring 應用內線程
    的頭像 發表于 02-28 10:42 ?739次閱讀
    主站蜘蛛池模板: 中文字幕在线播放不卡 | 亚洲国产色婷婷精品综合在线观看 | 特黄aaaaa日本大片免费看 | 91日韩精品天海翼在线观看 | 日韩免费在线视频 | 三级理论在线播放大全 | 女人张开双腿让男人桶完整 | 亚洲国产精品婷婷久久久久 | 久久新视频 | 美女午夜 | 色中文字幕在线 | 最近最新免费视频 | 国产精品天天爽夜夜欢张柏芝 | 男人搡女人视频免费看 | 丁香花在线视频观看免费 | 亚洲国产福利 | 中文在线最新版天堂bt | 国产三级观看久久 | 天天碰天天操 | 性猛交xxxx乱大交孕妇 | 色一欲一性一乱一区二区三区 | 欧洲妇女成人淫片aaa视频 | 欧美性猛交xxxxbbbb | 国产精品夜夜春夜夜 | 午夜日批 | 成人a毛片高清视频 | 热99re久久精品2久久久 | 国产成人精品亚洲日本在线观看 | 欧美天天色| 男人j进人女人j 的视频 | 一区在线观看视频 | 亚洲伊人久久大香线蕉结合 | 华人黄网站大全 | 四虎永久在线精品 | 天堂在线观看视频 | 四虎在线观看免费永久 | 国产一区二区三区乱码 | 蕾丝视频在线播放 | 欧洲乱码专区一区二区三区四区 | 天堂在线www网亚洲 天堂在线观看 | 在线观看免费av网站 |