国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > PHP > 正文

php面試中可能會(huì)遇到的關(guān)于線程池的問(wèn)題

2020-03-22 18:43:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章給大家介紹的內(nèi)容是關(guān)于面試中可能會(huì)遇到的關(guān)于線程池的問(wèn)題,有著一定的參考價(jià)值,有需要的朋友可以參考一下。

前言

面試中我們經(jīng)常會(huì)遇到多線程和線程池的問(wèn)題,究竟如何回答呢?今天關(guān)于Java中的線程池,我們就來(lái)學(xué)習(xí)一下。

什么是線程池

線程池是指在初始化一個(gè)多線程html' target='_blank'>應(yīng)用程序過(guò)程中創(chuàng)建一個(gè)線程集合,然后在需要執(zhí)行新的任務(wù)時(shí)重用這些線程而不是新建一個(gè)線程。線程池中線程的數(shù)量通常完全取決于可用內(nèi)存數(shù)量和應(yīng)用程序的需求。然而,增加可用線程數(shù)量是可能的。線程池中的每個(gè)線程都有被分配一個(gè)任務(wù),一旦任務(wù)已經(jīng)完成了,線程回到池子中并等待下一次分配任務(wù)。

說(shuō)白了就是為一應(yīng)用執(zhí)行多個(gè)線程的一個(gè)線程集合體。

為什么需要線程池?

使用線程池,我目前解決了一下問(wèn)題:

  • 利用線程池, 獲取一個(gè)視頻中的多個(gè)封面,從而節(jié)約了一些時(shí)間和資源

  • 后臺(tái)服務(wù)器不支持多張圖片上傳,利用線程池,進(jìn)行多張圖片上傳,從而減少上傳的時(shí)間

效果圖如下:



上傳前:9張圖片至少要用3秒,利用線程池優(yōu)化之后, 9張圖片要用1秒。

基于以下幾個(gè)原因在多線程應(yīng)用程序中使用線程是必須的:

  • 1.減少了創(chuàng)建和銷(xiāo)毀線程的次數(shù),每個(gè)工作線程都可以被重復(fù)利用,可執(zhí)行多個(gè)任務(wù)。

  • 2.可以根據(jù)系統(tǒng)的承受能力,調(diào)整線程池中工作線線程的數(shù)目,防止因?yàn)橄倪^(guò)多的內(nèi)存,而把服務(wù)器累趴下(每個(gè)線程需要大約1MB內(nèi)存,線程開(kāi)的越多,消耗的內(nèi)存也就越大,最后死機(jī))。

    1. 線程池改進(jìn)了一個(gè)應(yīng)用程序的響應(yīng)時(shí)間。由于線程池中的線程已經(jīng)準(zhǔn)備好且等待被分配任務(wù),應(yīng)用程序可以直接拿來(lái)使用而不用新建一個(gè)線程。

    2. 線程池節(jié)省了CLR 為每個(gè)短生存周期任務(wù)創(chuàng)建一個(gè)完整的線程的開(kāi)銷(xiāo)并可以在任務(wù)完成后回收資源。

    3. 線程池根據(jù)當(dāng)前在系統(tǒng)中運(yùn)行的進(jìn)程來(lái)優(yōu)化線程時(shí)間片。

    4. 線程池允許我們開(kāi)啟多個(gè)任務(wù)而不用為每個(gè)線程設(shè)置屬性。

    5. 線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個(gè)包含狀態(tài)信息的對(duì)象引用。

    6. 線程池可以用來(lái)解決處理一個(gè)特定請(qǐng)求最大線程數(shù)量限制問(wèn)題。

安撫多歲的發(fā)發(fā)發(fā)

線程池的作用:

線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。
根據(jù)系統(tǒng)的環(huán)境情況,可以自動(dòng)或手動(dòng)設(shè)置線程數(shù)量,達(dá)到運(yùn)行的最佳效果;少了浪費(fèi)了系統(tǒng)資源,多了造成系統(tǒng)擁擠效率不高。用線程池控制線程數(shù)量,其他線程排 隊(duì)等候。一個(gè)任務(wù)執(zhí)行完畢,再?gòu)年?duì)列的中取最前面的任務(wù)開(kāi)始執(zhí)行。若隊(duì)列中沒(méi)有等待進(jìn)程,線程池的這一資源處于等待。當(dāng)一個(gè)新任務(wù)需要運(yùn)行時(shí),如果線程池 中有等待的工作線程,就可以開(kāi)始運(yùn)行了;否則進(jìn)入等待隊(duì)列。

單線程的弊端

舉個(gè)例子

new Thread(new Runnable() {@Overridepublic void run() {   paPaPaYourGridFriend();}}).start();
重要的事情說(shuō)三遍!!!

如果你還在用new Thread執(zhí)行一個(gè)異步任務(wù),so你就Out了!
如果你還在用new Thread執(zhí)行一個(gè)異步任務(wù),so你就Out了!
如果你還在用new Thread執(zhí)行一個(gè)異步任務(wù),so你就Out了!

弊端如下:
  • a. 每次new Thread新建對(duì)象性能差。

  • b. 線程缺乏統(tǒng)一管理,可能無(wú)限制新建線程,相互之間競(jìng)爭(zhēng),及可能占用過(guò)多系統(tǒng)資源導(dǎo)致死機(jī)或oom。

  • c. 缺乏更多功能,如定時(shí)執(zhí)行、定期執(zhí)行、線程中斷。

Java 線程池

1. newSingleThreadExecutor

創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來(lái)替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。

2.newFixedThreadPool

創(chuàng)建固定大小的線程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。

3. newCachedThreadPool

創(chuàng)建一個(gè)可緩存的線程池。如果線程池的大小超過(guò)了處理任務(wù)所需要的線程,

那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能的添加新線程來(lái)處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線程大小。

4.newScheduledThreadPool

創(chuàng)建一個(gè)大小無(wú)限的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

newSingleThreadExecutor
  private void TextnewSingleThreadExecutor(){        ExecutorService pool = Executors. newSingleThreadExecutor();        MyTask1 task1 =   new MyTask1();        MyTask2 task2 =   new MyTask2();        MyTask3 task3 =   new MyTask3();//        pool.execute(task1);//        pool.execute(task2);//        pool.execute(task3);        new Thread(task1).start();        new Thread(task2).start();        new Thread(task3).start();    }    private class MyTask1 implements Runnable{        @Override        public void run() {            //循環(huán)輸出            for(int i = 0; i < 100; i++)            {                System.out.print("A"+i+"/t");            }        }    }    private class MyTask2 implements Runnable{        @Override        public void run() {//            try {//                Thread.sleep(1000);//            } catch (InterruptedException e) {//                e.printStackTrace();//            }            //循環(huán)輸出            for(int i = 0; i < 100; i++)            {                System.out.print("B"+i+"/t");            }        }    }    private class MyTask3 implements Runnable{        @Override        public void run() {            //循環(huán)輸出            for(int i = 0; i < 100; i++)            {                System.out.print("C"+i+"/t");            }        }    }
ScheduledExecutorService


newFixedThreadPool

newCachedThreadPool


相比new Thread,Java提供的四種線程池的好處在于:
  • a. 重用存在的線程,減少對(duì)象創(chuàng)建、消亡的開(kāi)銷(xiāo),性能佳。

  • b. 可有效控制最大并發(fā)線程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過(guò)多資源競(jìng)爭(zhēng),避免堵塞。

  • c. 提供定時(shí)執(zhí)行、定期執(zhí)行、單線程、并發(fā)數(shù)控制等功能。

線程池真的是太好用了,如果在項(xiàng)目中通過(guò)線程池管理線程,,你將會(huì)發(fā)現(xiàn)其中的諸多優(yōu)勢(shì)!

閱讀更多

20+個(gè)很棒的Android開(kāi)源項(xiàng)目

2018年Android面試題含答案--適合中高級(jí)(下)一份完整的Android Studio搭建Flutter教程[](http://mp.weixin.qq.com/s?__b...

深入了解JAVA的線程中斷方法經(jīng)驗(yàn)之總結(jié)

子線程為什么不能更新UI線程詳解

相信自己,沒(méi)有做不到的,只有想不到的

相關(guān)推薦:

php如何連接數(shù)據(jù)庫(kù)的方法

PHP中http的數(shù)據(jù)庫(kù)是如何進(jìn)行驗(yàn)證登錄

以上就是php面試中可能會(huì)遇到的關(guān)于線程池的問(wèn)題的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇江市| 唐山市| 武山县| 临澧县| 蒲江县| 卢湾区| 灵武市| 泗水县| 根河市| 波密县| 陆良县| 黎川县| 手游| 常山县| 沐川县| 白沙| 龙游县| 进贤县| 新源县| 太白县| 郑州市| 宁城县| 鲜城| 揭西县| 东乌珠穆沁旗| 台安县| 玛纳斯县| 湖南省| 阿尔山市| 元阳县| 昔阳县| 鹿邑县| 湄潭县| 吴忠市| 石景山区| 葫芦岛市| 伊宁市| 南平市| 永平县| 嫩江县| 平武县|