最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

模擬簡(jiǎn)單Java線程池的方法詳解

 更新時(shí)間:2022年03月30日 12:42:59   作者:見(jiàn)聞色霸氣~  
這篇文章主要為大家詳細(xì)介紹了模擬簡(jiǎn)單Java線程池的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

一、 前言

為了實(shí)現(xiàn)并發(fā)編程,于是就引入了進(jìn)程這個(gè)概念。進(jìn)程就相當(dāng)于操作系統(tǒng)的一個(gè)任務(wù)。多個(gè)進(jìn)程同時(shí)執(zhí)行任務(wù),就實(shí)現(xiàn)了并發(fā)編程,能夠更快的執(zhí)行。

但是由于進(jìn)程還不夠輕量,創(chuàng)建一個(gè)進(jìn)程,銷(xiāo)毀一個(gè)進(jìn)程消耗的資源不可忽視。如果進(jìn)程數(shù)量不多的情況下,這些資源消耗是可以接受的,但是如果頻繁的創(chuàng)建、銷(xiāo)毀進(jìn)程。就是一筆很大的開(kāi)銷(xiāo)了。

那要怎么辦呢?

為了解決這個(gè)問(wèn)題,人們引入了更輕量的工具——線程。

線程也被稱(chēng)為輕量級(jí)進(jìn)程。它的創(chuàng)建、銷(xiāo)毀比進(jìn)程消耗的資源更少。但是如果任務(wù)數(shù)量很多,多線程也頂不住頻繁的創(chuàng)建、銷(xiāo)毀了呢?這時(shí)線程池就出來(lái)解決問(wèn)題了!

二、線程池是什么?

線程池是類(lèi)似于Java字符串常量池一樣的東西。

使用線程VS不使用線程

  • 當(dāng)使用一個(gè)線程的時(shí)候,就直接從池子里取一個(gè)線程過(guò)來(lái)。
  • 當(dāng)不用一個(gè)線程的時(shí)候就把這個(gè)線程放到池子里

大家都知道找工作的流程大概是這樣的。

  • 投簡(jiǎn)歷
  • 筆試
  • 面試
  • offer

當(dāng)我們到面試完了之后,會(huì)有兩種情況。

  • 通過(guò)了,公司打電話通知你,給你發(fā)offer
  • 沒(méi)通過(guò),而且一般公司也不告訴你自己沒(méi)過(guò),而是完全沒(méi)通知你沒(méi)有過(guò),這是因?yàn)楣究赡軙?huì)把你放到他們的"人才貯備池"里了。

假設(shè)公司要找50個(gè)人,在秋招的時(shí)候,給50個(gè)人發(fā)了offer。 但是實(shí)際上,只有35個(gè)人來(lái)入職報(bào)道了。這時(shí)候,剩下的15個(gè)人就從人才貯備池里直接撈出15個(gè),直接發(fā)offer。

這時(shí)候可能過(guò)了一段時(shí)間,公司突然打電話通知你,你被錄用了,要不要來(lái)?這個(gè)操作就相當(dāng)于一個(gè)線程要被使用到了,直接從池子里拿出來(lái)用。

這就是用找工作的例子形容了一下線程池大概是什么意思。

三、線程池構(gòu)造方法ThreadPoolExecutor的構(gòu)造方法的參數(shù)都是啥意思?

在《阿里巴巴java開(kāi)發(fā)手冊(cè)》中指出了線程資源必須通過(guò)線程池提供,不允許在應(yīng)用中自行顯示的創(chuàng)建線程,這樣一方面是線程的創(chuàng)建更加規(guī)范,可以合理控制開(kāi)辟線程的數(shù)量;另一方面線程的細(xì)節(jié)管理交給線程池處理,優(yōu)化了資源的開(kāi)銷(xiāo)。

"ThreadPoolExecutor"這個(gè)類(lèi)是Java標(biāo)準(zhǔn)庫(kù)提供的一組類(lèi),用來(lái)使用線程池。

ThreadPoolExecutor的構(gòu)造方法有四個(gè)。分別含有不同的參數(shù),使用的場(chǎng)景也不同。
我們就以參數(shù)最多的構(gòu)造方法來(lái)介紹。

ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor (
int corePoolSize,
int maximumPoolSize ,
long keepAliveTime ,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
 ThreadFactory threadFactory,
 RejectedExecutionHandler handler
 )

在這里插入圖片描述

1.corePoolSize 核心線程數(shù)

2.maximumPoolSize 最大線程數(shù)

對(duì)于核心線程數(shù)和最大線程數(shù)可能不是很理解到底是干嘛的,這里舉一個(gè)員工上班的例子。

核心線程數(shù),就是公司里的正式員工,允許他們可以摸魚(yú)一會(huì)。 被發(fā)現(xiàn)了不至于開(kāi)除。(相當(dāng)于線程池中的線程就算什么也不干也不會(huì)被銷(xiāo)毀)

最大線程數(shù),就是公司里的正式員工+臨時(shí)工組成的數(shù)量,但是這里的臨時(shí)工摸魚(yú)到了一定時(shí)間了就要被開(kāi)除。(相當(dāng)于線程池中的線程被銷(xiāo)毀)

3.keepAliveTime 描述臨時(shí)工能摸魚(yú)多長(zhǎng)時(shí)間的

4.unit 是一個(gè)時(shí)間單位,也就是keepAliveTime的單位。

5.workQueue 阻塞隊(duì)列,就組織了線程池要執(zhí)行的任務(wù)

6.threadFactory 線程的創(chuàng)建方式,通過(guò)這個(gè)參數(shù)來(lái)設(shè)定不同線程的創(chuàng)建方式

7.RejectedExecutionHandler handler 拒絕策略。當(dāng)任務(wù)隊(duì)列滿(mǎn)了的時(shí)候,新任務(wù)又來(lái)了,這時(shí)候咋辦?

(1):最新的任務(wù)不要了

(2):最老的任務(wù)不要了

(3):阻塞等待

(4)開(kāi)擺:拋出異常

由于ThreadPoolExecutor使用起來(lái)比較復(fù)雜,最多有7個(gè)參數(shù)。標(biāo)準(zhǔn)庫(kù)為此又為程序員們提供了一組其他的類(lèi)。相當(dāng)于對(duì)ThreadPoolExecutor又進(jìn)行了一層封裝。

1.newFixedThreadPool:創(chuàng)建出一個(gè)固定線程數(shù)量的線程池。

 ExecutorService Service1   =  Executors.newFixedThreadPool (20);

2.newCachedThreadPool:創(chuàng)建出一個(gè)數(shù)量可變的線程池

ExecutorService Service2   = Executors.newCachedThreadPool ();

3.newSingleThreadExecutor:創(chuàng)建只有一個(gè)線程的線程池

ExecutorService Service3  = Executors.newSingleThreadExecutor ();

4.newScheduledThreadPool:創(chuàng)建一個(gè)能設(shè)定延時(shí)時(shí)間的線程池。

ExecutorService Service4   = Executors.newScheduledThreadPool (20);

四、模擬實(shí)現(xiàn)一個(gè)線程池

模擬實(shí)現(xiàn)一個(gè)線程池的核心操作:
.:將任務(wù)加到線程池中--submit。
.:使用Worker類(lèi)描述一個(gè)工作線程,Runnable來(lái)描述一個(gè)任務(wù)。
.:創(chuàng)建一個(gè)BlockingQueue阻塞隊(duì)列組織所有任務(wù)。
.:每個(gè)Worker要做的事情就是不停的從阻塞隊(duì)列里獲取任務(wù)并執(zhí)行。
.:指定線程池中的線程最大數(shù)目,如果超過(guò)這個(gè)數(shù)目就不要再繼續(xù)創(chuàng)建線程了。

代碼實(shí)現(xiàn):

我們創(chuàng)建一個(gè)線程池并讓它不停的創(chuàng)建進(jìn)程打印hello

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * Created with IntelliJ IDEA.
 *
 
 * @Description: 模擬實(shí)現(xiàn)線程池的使用
 */
public class ThreadDemo0327_2 {
    public static void main (String[] args) throws IOException, InterruptedException {
        ThreadPoll threadPoll=new ThreadPoll ();
        for (int i = 0 ; i <10  ; i++) {
            threadPoll.submit (new Runnable () {
                @Override
                public void run () {
                    System.out.println ("hello");
                }
            });
        }
    }
}

class  Worker extends  Thread{
    public   BlockingQueue<Runnable> queue=null;
    public Worker(BlockingQueue<Runnable> queue){
        this.queue=queue;
    }

    @Override
    public void run () {
        //工作線程的具體邏輯
        //需要從阻塞隊(duì)列中取任務(wù).
        while (true){
            try {
                Runnable command=queue.take ();
                //通過(guò)run來(lái)執(zhí)行具體任務(wù)
                command.run ();
            }catch (InterruptedException e){
                e.printStackTrace ();
            }
        }
    }
}

class  ThreadPoll{
    //包含一個(gè)阻塞隊(duì)列,用來(lái)組織任務(wù)
  public   BlockingQueue<Runnable> queue=new LinkedBlockingQueue<> ();

    //這個(gè)list就用來(lái)存放當(dāng)前的工作線程.
    public  List<Thread> works=new ArrayList<> ();

    public  int MAX_WORKER_COUNT=10;

    //通過(guò)這個(gè)方法,把任務(wù)加入到線程池中
    //submit不光可以把任務(wù)放到阻塞隊(duì)列中,也可以負(fù)責(zé)創(chuàng)建線程
    public  void submit(Runnable command) throws IOException, InterruptedException {
        if(works.size ()<MAX_WORKER_COUNT){
            //如果當(dāng)前工作線程的數(shù)量不足線程數(shù)目上線,就創(chuàng)建出新的線程
            //工作線程就專(zhuān)門(mén)找一個(gè)類(lèi)完成
            //worker內(nèi)部要哦能夠取到隊(duì)列的內(nèi)容,就要把這個(gè)隊(duì)列實(shí)例通過(guò)worker的構(gòu)造方法傳過(guò)去
            Worker worker=new Worker (queue);
            worker.start ();
            works.add (worker);
        }
        queue.put (command);
    }
}

運(yùn)行效果:

可以看到,打印了10個(gè)hello。

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 一文弄懂Maven依賴(lài)范圍

    一文弄懂Maven依賴(lài)范圍

    本文詳細(xì)介紹了Maven依賴(lài)范圍的概念、應(yīng)用及其在項(xiàng)目構(gòu)建和管理中的重要性,依賴(lài)范圍包括compile、provided、runtime、test和system等類(lèi)型,每種范圍定義了依賴(lài)在不同構(gòu)建階段的可用性和打包行為,感興趣的可以了解一下
    2024-11-11
  • Java中的volatile關(guān)鍵字解析

    Java中的volatile關(guān)鍵字解析

    這篇文章主要介紹了Java中的volatile關(guān)鍵字解析,Java內(nèi)存模型規(guī)定了所有的變量都存儲(chǔ)在主內(nèi)存中,每個(gè)線程都有自己的工作內(nèi)存,線程的工作內(nèi)存保存了該線程使用到的變量的是主內(nèi)存副本的拷貝,需要的朋友可以參考下
    2023-11-11
  • mybatis中映射文件include標(biāo)簽的應(yīng)用

    mybatis中映射文件include標(biāo)簽的應(yīng)用

    這篇文章主要介紹了mybatis中映射文件include標(biāo)簽的應(yīng)用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決

    SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決

    這篇文章主要介紹了SpringDataJpa寫(xiě)原生sql遇到的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • tomcat connection-timeout連接超時(shí)源碼解析

    tomcat connection-timeout連接超時(shí)源碼解析

    這篇文章主要為大家介紹了tomcat connection-timeout連接超時(shí)源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 如何保證RabbitMQ全鏈路數(shù)據(jù)100%不丟失問(wèn)題

    如何保證RabbitMQ全鏈路數(shù)據(jù)100%不丟失問(wèn)題

    這篇文章主要介紹了如何保證RabbitMQ全鏈路數(shù)據(jù)100%不丟失問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法分析

    微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法分析

    這篇文章主要介紹了微信js sdk invalid signature簽名錯(cuò)誤問(wèn)題的解決方法,結(jié)合實(shí)例形式分析了微信簽名錯(cuò)誤問(wèn)題相關(guān)解決方法,需要的朋友可以參考下
    2019-04-04
  • Java源碼解析ConcurrentHashMap的初始化

    Java源碼解析ConcurrentHashMap的初始化

    今天小編就為大家分享一篇關(guān)于Java源碼解析ConcurrentHashMap的初始化,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java去掉字符串最后一個(gè)逗號(hào)的方法

    Java去掉字符串最后一個(gè)逗號(hào)的方法

    Java中去掉字符串的最后一個(gè)逗號(hào)有多種實(shí)現(xiàn)方法,不同的方法適用于不同的場(chǎng)景,本文通過(guò)實(shí)例代碼介紹Java去掉字符串最后一個(gè)逗號(hào)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-12-12
  • springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200

    springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200

    這篇文章主要介紹了springboot實(shí)現(xiàn)修改請(qǐng)求狀態(tài)404改為200方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

涞水县| 舞钢市| 湄潭县| 交城县| 城步| 教育| 鄯善县| 万年县| 广西| 安多县| 孝感市| 莲花县| 廊坊市| 万盛区| 英吉沙县| 大同市| 封丘县| 丰台区| 灌南县| 光泽县| 沁源县| 施甸县| 阳东县| 山阳县| 枣强县| 曲水县| 沁源县| 德清县| 平利县| 定襄县| 安新县| 康定县| 晋宁县| 江华| 八宿县| 大理市| 巫溪县| 保德县| 东台市| 讷河市| 电白县|