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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

大師,最近我在學(xué)習(xí)線程,有很多迷惑的地方。

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

第一個(gè)問題問題就是為什么要多線程啊, 我看了操作系統(tǒng)中的多進(jìn)程管理,不是挺好的嗎? 多線程似乎沒有必要啊!

不錯(cuò),多問問為什么,總是有好處的。所謂線程,就是程序代碼的執(zhí)行,一個(gè)進(jìn)程至少得有一個(gè)線程,要不然,這個(gè)進(jìn)程怎么運(yùn)行? 對(duì)吧?

這個(gè)我理解。

以你常用的Word為例,假設(shè)這個(gè)進(jìn)程沒有多線程(或者說它只有一個(gè)線程), 如果它有個(gè)定時(shí)保存文檔的功能,你想象下,當(dāng)這個(gè)自動(dòng)保存的功能在運(yùn)行的時(shí)候,你還能繼續(xù)輸入文字嗎?

不能

對(duì),這就是問題所在了,單線程只能干一件事情,無法并發(fā)和并行。直接導(dǎo)致用戶體驗(yàn)不好。CPU快速的運(yùn)算能力,還有多核,就被浪費(fèi)了。

那我完全可以用多進(jìn)程來處理啊, 一個(gè)進(jìn)程來接受用戶輸入文字,另外一個(gè)進(jìn)程來自動(dòng)保存。

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

原來如此。

古人云:進(jìn)程是擁有資源的基本單位, 線程是CPU調(diào)度的基本單位,這句話你理解嗎?

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

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

假設(shè)Word有兩個(gè)線程:T1負(fù)責(zé)接受用戶的文字輸入,T2 負(fù)責(zé)自動(dòng)保存。

QQ音樂也有兩個(gè)線程:T3負(fù)責(zé)從Socket中讀取數(shù)據(jù),T4負(fù)責(zé)對(duì)音樂數(shù)據(jù)進(jìn)行解碼。

操作系統(tǒng)在做調(diào)度的時(shí)候,基本單位不是Word,QQ音樂這樣的進(jìn)程,而是T1, T2,T3,T4這些線程。明白了嗎?

(點(diǎn)頭)原來每個(gè)線程執(zhí)行的都是進(jìn)程代碼的某個(gè)片段啊! 對(duì)了,我聽?zhēng)熜謧冊(cè)谟懻撌裁?a href="http://m.xsypw.cn/v/tag/852/" target="_blank">Java多線程編程,說是很復(fù)雜,但是他們從來沒提到過Java 多進(jìn)程編程,這是怎么回事啊?

不錯(cuò),你的師兄們都沒有想到這個(gè)問題,看來你已經(jīng)開始思考了。我先問你,你寫的Java程序是不是運(yùn)行在JVM中? 對(duì)操作系統(tǒng)來說,JVM是個(gè)什么東西?

嗯... JVM其實(shí)就是java.exe運(yùn)行起來,那它肯定是個(gè)進(jìn)程了。

那在一個(gè)進(jìn)程中還能進(jìn)行多進(jìn)程編程嗎?

(恍然大悟)奧,那是肯定不行了,Java程序運(yùn)行在JVM當(dāng)中, JVM這個(gè)進(jìn)程其實(shí)就是他們的容器。 我聽說Python, Ruby 等動(dòng)態(tài)語言也都有虛擬機(jī), 這么說他們也可以進(jìn)行多線程編程了。

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

我在Java 中創(chuàng)建了一個(gè)Thread對(duì)象,為什么要調(diào)用start方法才能啟動(dòng)線程? 為什么不能直接調(diào)用run方法呢?

你要是直接調(diào)用run()方法,會(huì)是什么效果?

就是用當(dāng)前線程去執(zhí)行一個(gè)普通函數(shù)而已,根本沒有什么新線程創(chuàng)建出來。

這就對(duì)了,你想創(chuàng)建一個(gè)新的線程出來,肯定得有準(zhǔn)備工作啊,設(shè)置好這個(gè)線程的上下文,比如這個(gè)線程的棧(用于函數(shù)調(diào)用),線程的狀態(tài),這個(gè)線程的PC(Program Counter)等等一系列信息以后,這個(gè)線程才可以被調(diào)度, 一旦被調(diào)度,就會(huì)執(zhí)行那個(gè)run()方法了

明白了大師,還有一個(gè)問題,既然線程是屬于進(jìn)程的,可以共享進(jìn)程的資源, 那創(chuàng)建一個(gè)線程應(yīng)該很輕松啊,為什么要有線程池這個(gè)東西呢?

雖然線程是個(gè)輕量級(jí)的東西, 但是對(duì)于互聯(lián)網(wǎng)應(yīng)用來說,如果每個(gè)用戶的請(qǐng)求都創(chuàng)建一個(gè)線程,那會(huì)非常得多,服務(wù)器也是難于承受, 再說了,眾多的線程去競(jìng)爭(zhēng)CPU,不斷切換,也會(huì)讓CPU調(diào)度不堪重負(fù),很多線程將不得不等待。所以前輩們的思路就是(1)用少量的線程 (2) 讓線程保持忙碌

奧,就是說只創(chuàng)建一定數(shù)量的線程,讓這些線程去處理所有的任務(wù),任務(wù)執(zhí)行完了以后,線程并不結(jié)束,而是回到線程池中去,等待接受下一個(gè)任務(wù)。

這些線程可以預(yù)先創(chuàng)建,任務(wù)來了就不用臨時(shí)再創(chuàng)建了,立刻開始服務(wù)。

預(yù)先創(chuàng)建? 您剛才不是說線程是程序代碼的執(zhí)行嗎? 它是個(gè)動(dòng)態(tài)的東西,怎么可能預(yù)先創(chuàng)建? 如果真的創(chuàng)建起來了,就會(huì)調(diào)用run方法, 馬上執(zhí)行完了, 線程就結(jié)束了!

你忘了重要的一點(diǎn),線程的狀態(tài)。當(dāng)線程池的線程剛創(chuàng)建時(shí),讓他們進(jìn)入阻塞狀態(tài):等待某個(gè)任務(wù)的到來。 如果任務(wù)來了,那就好辦,喚醒其中一個(gè)線程,讓它拿到任務(wù)去執(zhí)行即可。

可是怎么讓他們進(jìn)入阻塞狀態(tài)?

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

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

線程池中的Worker線程:public class WorkerThread extends Thread { private BlockingQueue taskQueue = null; private boolean isStopped = false; //持有一個(gè)BlockingQueue的實(shí)例 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. } } } ......略......}

沒錯(cuò),你這個(gè)代碼是一種簡(jiǎn)單的實(shí)現(xiàn),我的老朋友Doug Lea大師寫了一套非常好的實(shí)現(xiàn),已經(jīng)被吸收進(jìn)JDK了,作為java.util.concurrent包的一部分,你直接調(diào)用即可,不用自己動(dòng)手了。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 線程池
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    7089
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20084

原文標(biāo)題:小白科普:線程和線程池

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    跨平臺(tái)的線程組件--TP組件

    /銷毀代價(jià)是很高的。那么我們要怎么去設(shè)計(jì)多線程編程呢???答案:對(duì)于長(zhǎng)駐的線程,我們可以創(chuàng)建獨(dú)立的線程去執(zhí)行。但是非長(zhǎng)駐的線程,我們可以通過線程
    的頭像 發(fā)表于 04-06 15:39 ?1097次閱讀

    Java中的線程包括哪些

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

    線程是如何實(shí)現(xiàn)的

    線程的概念是什么?線程是如何實(shí)現(xiàn)的?
    發(fā)表于 02-28 06:20

    基于線程技術(shù)集群接入點(diǎn)的應(yīng)用研究

    本文在深入研究高級(jí)線程技術(shù)的基礎(chǔ)上,分析、研究了固定線程數(shù)目的線程線程數(shù)目動(dòng)態(tài)變化的
    發(fā)表于 01-22 14:21 ?5次下載

    java自帶的線程方法

    二、原理分析 從上面使用線程的例子來看,最主要就是兩步,構(gòu)造ThreadPoolExecutor對(duì)象,然后每來一個(gè)任務(wù),就調(diào)用ThreadPoolExecutor對(duì)象的execute方法。 1
    發(fā)表于 09-27 11:06 ?0次下載

    基于Nacos的簡(jiǎn)單動(dòng)態(tài)化線程實(shí)現(xiàn)

    本文以Nacos作為服務(wù)配置中心,以修改線程核心線程數(shù)、最大線程數(shù)為例,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)化線程
    發(fā)表于 01-06 14:14 ?1051次閱讀

    線程線程

    線程通常用于服務(wù)器應(yīng)用程序。 每個(gè)傳入請(qǐng)求都將分配給線程池中的一個(gè)線程,因此可以異步處理請(qǐng)求,而不會(huì)占用主線程,也不會(huì)延遲后續(xù)請(qǐng)求的處理
    的頭像 發(fā)表于 02-28 09:53 ?1027次閱讀
    多<b class='flag-5'>線程</b>之<b class='flag-5'>線程</b><b class='flag-5'>池</b>

    Java線程核心原理

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

    線程線程怎么釋放

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

    Spring 的線程應(yīng)用

    我們?cè)谌粘i_發(fā)中,經(jīng)常跟多線程打交道,Spring 為我們提供了一個(gè)線程方便我們開發(fā),它就是 ThreadPoolTaskExecutor ,接下來我們就來聊聊 Spring 的線程
    的頭像 發(fā)表于 10-13 10:47 ?790次閱讀
    Spring 的<b class='flag-5'>線程</b><b class='flag-5'>池</b>應(yīng)用

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優(yōu)勢(shì) C++線程簡(jiǎn)介
    的頭像 發(fā)表于 11-10 10:24 ?882次閱讀

    線程的基本概念

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

    線程七大核心參數(shù)執(zhí)行順序

    線程是一種用于管理和調(diào)度線程執(zhí)行的技術(shù),通過將任務(wù)分配到線程池中的線程進(jìn)行處理,可以有效地控制并發(fā)線程
    的頭像 發(fā)表于 12-04 16:45 ?1459次閱讀

    線程的創(chuàng)建方式有幾種

    線程是一種用于管理和調(diào)度線程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過預(yù)先創(chuàng)建一組線程并維護(hù)一個(gè)工作隊(duì)列,將任務(wù)提交給線程
    的頭像 發(fā)表于 12-04 16:52 ?1207次閱讀

    什么是動(dòng)態(tài)線程?動(dòng)態(tài)線程的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線程一種針對(duì)以上痛點(diǎn)開發(fā)的線程管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線程
    的頭像 發(fā)表于 02-28 10:42 ?1028次閱讀
    主站蜘蛛池模板: 性欧美极品 | 欧美三级黄视频 | 黄色在线网站视频 | 男人午夜天堂 | 日韩免费一区 | 男人天堂网在线播放 | 国产干美女 | 一区一精品 | 婷婷五月色综合香五月 | 国模在线观看 | 又大又粗又爽黄毛片 | 欧美肉到失禁高h视频在线 欧美三级成人 | 色噜噜噜噜噜 | 香港经典a毛片免费观看爽爽影院 | 天天操综合视频 | 成人在线网| 亚洲最新网站 | 久久精品网站免费观看 | 一级片在线免费看 | 一区二区三区网站在线免费线观看 | 男人边吃奶边做视频免费网站 | 四虎精品免费永久在线 | 久久国内精品 | 成人a毛片手机免费播放 | 性欧美护士18xxxxhd | 91视频色 | 日本高清午夜色wwwσ | 狠狠色丁香九九婷婷综合五月 | www天堂网| 女的扒开尿口让男人桶 | 亚洲色四在线视频观看 | 花怜write. as | 天天干夜夜谢 | 国产yw.8825.c免费 | 一色桃子juy774在线播放 | 永久毛片 | www.91大神| 久久夜色精品国产噜噜小说 | 午夜久久久 | 五月天激情综合网 | 亚洲国产欧美在线人成aaa |