成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

高級(jí)面試題總結(jié)—線程池還能這么玩?

learning / 1895人閱讀

摘要:線程池可以用來(lái)解決處理一個(gè)特定請(qǐng)求最大線程數(shù)量限制問(wèn)題。安撫多歲的發(fā)發(fā)發(fā)線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。若隊(duì)列中沒(méi)有等待進(jìn)程,線程池的這一資源處于等待。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。

前言

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

什么是線程池

線程池是指在初始化一個(gè)多線程應(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ī))。

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

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

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

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

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

線程池可以用來(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() {

@Override
public 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+"	");
            }

        }
    }
    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+"	");
            }
        }
    }
    private class MyTask3 implements Runnable{
        @Override
        public void run() {
            //循環(huán)輸出
            for(int i = 0; i < 100; i++)
            {
                System.out.print("C"+i+"	");
            }
        }
    }
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)有做不到的,只有想不到的

在這里獲得的不僅僅是技術(shù)!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71662.html

相關(guān)文章

  • 高級(jí)面試總結(jié)線程還能這么?

    摘要:線程池可以用來(lái)解決處理一個(gè)特定請(qǐng)求最大線程數(shù)量限制問(wèn)題。安撫多歲的發(fā)發(fā)發(fā)線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。若隊(duì)列中沒(méi)有等待進(jìn)程,線程池的這一資源處于等待。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 前言 面試中我們經(jīng)常會(huì)遇到多線程和線程池的問(wèn)題,究竟如何回答呢?今天關(guān)于Java中的線程池,我們就來(lái)學(xué)習(xí)一下。 什么是線程池 線程池是指在初始化一個(gè)多線程應(yīng)用程序過(guò)程中創(chuàng)建...

    dinfer 評(píng)論0 收藏0
  • 美團(tuán)面試:Java-線程池 ThreadPool 專(zhuān)詳解

    摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...

    enrecul101 評(píng)論0 收藏0
  • 美團(tuán)面試:Java-線程池 ThreadPool 專(zhuān)詳解

    摘要:去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用以下做個(gè)總結(jié)。二線程池線程池的作用線程池作用就是限制系統(tǒng)中執(zhí)行線程的數(shù)量。真正的線程池接口是。創(chuàng)建固定大小的線程池。此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。 去美團(tuán)面試,問(wèn)到了什么是線程池,如何使用,為什么要用,以下做個(gè)總結(jié)。關(guān)于線程之前也寫(xiě)過(guò)一篇文章《高級(jí)面試題總結(jié)—線程池還能這么玩?》 1、什么是線程池:? java.util...

    wujl596 評(píng)論0 收藏0
  • 簡(jiǎn)析TCP的三次握手與四次分手

    摘要:在協(xié)議中,協(xié)議提供可靠的連接服務(wù),連接是通過(guò)三次握手進(jìn)行初始化的。三次握手的目的是同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換窗口大小信息。采用三次握手的辦法可以防止上述現(xiàn)象發(fā)生。 TCP是什么? 具體的關(guān)于TCP是什么,我不打算詳細(xì)的說(shuō)了;當(dāng)你看到這篇文章時(shí),我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我們就繼續(xù)。它只是一個(gè)超級(jí)麻煩的協(xié)議,而它又是互聯(lián)網(wǎng)的基礎(chǔ),也是每個(gè)程序員必備...

    LucasTwilight 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<