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

資訊專(zhuān)欄INFORMATION COLUMN

java 四種線(xiàn)程池的使用

gggggggbong / 771人閱讀

摘要:四種線(xiàn)程池的使用介紹的弊端及四種線(xiàn)程池的使用,線(xiàn)程池的作用線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。相比,提供的四種線(xiàn)程池的好處在于重用存在的線(xiàn)程,減少對(duì)象創(chuàng)建消亡的開(kāi)銷(xiāo),性能佳。延遲執(zhí)行描述創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。

java 四種線(xiàn)程池的使用

介紹new Thread的弊端及Java四種線(xiàn)程池的使用

1,線(xiàn)程池的作用

線(xiàn)程池作用就是限制系統(tǒng)中執(zhí)行線(xiàn)程的數(shù)量。

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

2,為什么要用線(xiàn)程池?

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

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

Java里面線(xiàn)程池的頂級(jí)接口是Executor,但是嚴(yán)格意義上講Executor并不是一個(gè)線(xiàn)程池,而只是一個(gè)執(zhí)行線(xiàn)程的工具。真正的線(xiàn)程池接口是ExecutorService。

3,比較重要的幾個(gè)類(lèi)
類(lèi) 描述
ExecutorService 真正的線(xiàn)程池接口。
ScheduledExecutorService 能和Timer/TimerTask類(lèi)似,解決那些需要任務(wù)重復(fù)執(zhí)行的問(wèn)題。
ThreadPoolExecutor ExecutorService的默認(rèn)實(shí)現(xiàn)。
ScheduledThreadPoolExecutor 繼承ThreadPoolExecutor的ScheduledExecutorService接口實(shí)現(xiàn),周期性任務(wù)調(diào)度的類(lèi)實(shí)現(xiàn)。
4,new Thread的弊端
public class TestNewThread {

    public static void main(String[] args) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("start");
            }
        }).start();
    }
}

執(zhí)行一個(gè)異步任務(wù)你還只是如下new Thread嗎?

那你就out太多了,new Thread的弊端如下:

1.每次new Thread新建對(duì)象性能差。
2.線(xiàn)程缺乏統(tǒng)一管理,可能無(wú)限制新建線(xiàn)程,相互之間競(jìng)爭(zhēng),及可能占用過(guò)多系統(tǒng)資源導(dǎo)致死機(jī)或oom。
3.缺乏更多功能,如定時(shí)執(zhí)行、定期執(zhí)行、線(xiàn)程中斷。

相比new Thread,Java提供的四種線(xiàn)程池的好處在于:

1.重用存在的線(xiàn)程,減少對(duì)象創(chuàng)建、消亡的開(kāi)銷(xiāo),性能佳。
2.可有效控制最大并發(fā)線(xiàn)程數(shù),提高系統(tǒng)資源的使用率,同時(shí)避免過(guò)多資源競(jìng)爭(zhēng),避免堵塞。
3.提供定時(shí)執(zhí)行、定期執(zhí)行、單線(xiàn)程、并發(fā)數(shù)控制等功能。

四種線(xiàn)程池

Java通過(guò)Executors提供四種線(xiàn)程池,分別為:

1,newCachedThreadPoo

創(chuàng)建一個(gè)可緩存線(xiàn)程池,如果線(xiàn)程池長(zhǎng)度超過(guò)處理需要,可靈活回收空閑線(xiàn)程,若無(wú)可回收,則新建線(xiàn)程。

2,newFixedThreadPool

創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,可控制線(xiàn)程最大并發(fā)數(shù),超出的線(xiàn)程會(huì)在隊(duì)列中等待。

3,newScheduledThreadPool

創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。

4,newSingleThreadExecutor

創(chuàng)建一個(gè)單線(xiàn)程化的線(xiàn)程池,它只會(huì)用唯一的工作線(xiàn)程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。

示例 1,newCachedThreadPool

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

package io.ymq.thread.demo1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述: 創(chuàng)建一個(gè)可緩存的線(xiàn)程池。如果線(xiàn)程池的大小超過(guò)了處理任務(wù)所需要的線(xiàn)程,那么就會(huì)回收部分空閑(60秒不執(zhí)行任務(wù))的線(xiàn)程,當(dāng)任務(wù)數(shù)增加時(shí),此線(xiàn)程池又可以智能的添加新線(xiàn)程來(lái)處理任務(wù)。
 * 此線(xiàn)程池不會(huì)對(duì)線(xiàn)程池大小做限制,線(xiàn)程池大小完全依賴(lài)于操作系統(tǒng)(或者說(shuō)JVM)能夠創(chuàng)建的最大線(xiàn)程大小。
 *
 * @author yanpenglei
 * @create 2017-10-12 11:13
 **/
public class TestNewCachedThreadPool {
    public static void main(String[] args) {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            try {
                Thread.sleep(index * 1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            cachedThreadPool.execute(new Runnable() {

                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    System.out.println("執(zhí)行:" + index + ",線(xiàn)程名稱(chēng):" + threadName);
                }
            });
        }
    }
}

響應(yīng):

執(zhí)行:1,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:2,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:3,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:4,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:5,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:6,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:7,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:8,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:9,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:10,線(xiàn)程名稱(chēng):pool-1-thread-1
2,newFixedThreadPool

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

package io.ymq.thread.demo2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述:創(chuàng)建固定大小的線(xiàn)程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線(xiàn)程,直到線(xiàn)程達(dá)到線(xiàn)程池的最大大小。
 * 線(xiàn)程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線(xiàn)程因?yàn)閳?zhí)行異常而結(jié)束,那么線(xiàn)程池會(huì)補(bǔ)充一個(gè)新線(xiàn)程。
 *
 * @author yanpenglei
 * @create 2017-10-12 11:30
 **/
public class TestNewFixedThreadPool {

    public static void main(String[] args) {

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

        for (int i = 1; i <= 10; i++) {
            final int index = i;
            fixedThreadPool.execute(new Runnable() {

                @Override
                public void run() {
                    try {
                        String threadName = Thread.currentThread().getName();
                        System.out.println("執(zhí)行:" + index + ",線(xiàn)程名稱(chēng):" + threadName);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }
                }
            });
        }

    }
}

因?yàn)榫€(xiàn)程池大小為3,每個(gè)任務(wù)輸出index后sleep 2秒,所以每?jī)擅氪蛴?個(gè)數(shù)字,和線(xiàn)程名稱(chēng)。

響應(yīng):

執(zhí)行:2,線(xiàn)程名稱(chēng):pool-1-thread-2
執(zhí)行:3,線(xiàn)程名稱(chēng):pool-1-thread-3
執(zhí)行:1,線(xiàn)程名稱(chēng):pool-1-thread-1

執(zhí)行:4,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:6,線(xiàn)程名稱(chēng):pool-1-thread-2
執(zhí)行:5,線(xiàn)程名稱(chēng):pool-1-thread-3

執(zhí)行:7,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:9,線(xiàn)程名稱(chēng):pool-1-thread-3
執(zhí)行:8,線(xiàn)程名稱(chēng):pool-1-thread-2

執(zhí)行:10,線(xiàn)程名稱(chēng):pool-1-thread-1
3,newScheduledThreadPool

創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。延遲執(zhí)行

package io.ymq.thread.demo3;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 描述:創(chuàng)建一個(gè)定長(zhǎng)線(xiàn)程池,支持定時(shí)及周期性任務(wù)執(zhí)行。延遲執(zhí)行
 *
 * @author yanpenglei
 * @create 2017-10-12 11:53
 **/
public class TestNewScheduledThreadPool {

    public static void main(String[] args) {

        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

        scheduledThreadPool.schedule(new Runnable() {

            @Override
            public void run() {
                System.out.println("表示延遲3秒執(zhí)行。");
            }
        }, 3, TimeUnit.SECONDS);


        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                System.out.println("表示延遲1秒后每3秒執(zhí)行一次。");
            }
        }, 1, 3, TimeUnit.SECONDS);
    }

}
表示延遲1秒后每3秒執(zhí)行一次。
表示延遲3秒執(zhí)行。
表示延遲1秒后每3秒執(zhí)行一次。
表示延遲1秒后每3秒執(zhí)行一次。
表示延遲1秒后每3秒執(zhí)行一次。
表示延遲1秒后每3秒執(zhí)行一次。
4,newSingleThreadExecutor

創(chuàng)建一個(gè)單線(xiàn)程化的線(xiàn)程池,它只會(huì)用唯一的工作線(xiàn)程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。

package io.ymq.thread.demo4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述:創(chuàng)建一個(gè)單線(xiàn)程化的線(xiàn)程池,它只會(huì)用唯一的工作線(xiàn)程來(lái)執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
 *
 * @author yanpenglei
 * @create 2017-10-12 12:05
 **/
public class TestNewSingleThreadExecutor {

    public static void main(String[] args) {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {

                @Override
                public void run() {
                    try {
                        String threadName = Thread.currentThread().getName();
                        System.out.println("執(zhí)行:" + index + ",線(xiàn)程名稱(chēng):" + threadName);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

結(jié)果依次輸出,相當(dāng)于順序執(zhí)行各個(gè)任務(wù)。

響應(yīng):

執(zhí)行:1,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:2,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:3,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:4,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:5,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:6,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:7,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:8,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:9,線(xiàn)程名稱(chēng):pool-1-thread-1
執(zhí)行:10,線(xiàn)程名稱(chēng):pool-1-thread-1
Contact

作者:鵬磊

出處:http://www.ymq.io

Email:[email protected]

版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處

Wechat:關(guān)注公眾號(hào),搜云庫(kù),專(zhuān)注于開(kāi)發(fā)技術(shù)的研究與知識(shí)分享

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

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

相關(guān)文章

  • Java四種線(xiàn)程池的使用

    摘要:它是一種線(xiàn)程數(shù)量固定的線(xiàn)程池,當(dāng)線(xiàn)程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收,除非線(xiàn)程池被關(guān)閉。這類(lèi)線(xiàn)程池內(nèi)部只有一個(gè)核心線(xiàn)程,它確保所有的任務(wù)都在同一個(gè)線(xiàn)程中按順序執(zhí)行。 FixedThreadPool 由Executors的newFixedThreadPool方法創(chuàng)建。它是一種線(xiàn)程數(shù)量固定的線(xiàn)程池,當(dāng)線(xiàn)程處于空閑狀態(tài)時(shí),他們并不會(huì)被回收,除非線(xiàn)程池被關(guān)閉。當(dāng)所有的線(xiàn)程都處于活動(dòng)狀態(tài)時(shí),新的...

    zhoutao 評(píng)論0 收藏0
  • java線(xiàn)程池的基本使用

    摘要:此外,有兩個(gè)常用的關(guān)閉線(xiàn)程池的方法第一個(gè)方法將啟動(dòng)一次順序關(guān)閉,有任務(wù)在執(zhí)行,則等待執(zhí)行完成,但不接受新的任務(wù)第二個(gè)方法將取消所有未開(kāi)始的任務(wù)并且試圖中斷正在執(zhí)行的任務(wù),返回從未開(kāi)始執(zhí)行的任務(wù)的列表。 四種線(xiàn)程池 在Executors中提供了四種線(xiàn)程池: newCachedThreadPool 可緩存線(xiàn)程池,對(duì)于每個(gè)線(xiàn)程,如果有空閑線(xiàn)程可用,立即讓它執(zhí)行,如果沒(méi)有,則創(chuàng)建一個(gè)新線(xiàn)...

    sf190404 評(píng)論0 收藏0
  • 后端ing

    摘要:當(dāng)活動(dòng)線(xiàn)程核心線(xiàn)程非核心線(xiàn)程達(dá)到這個(gè)數(shù)值后,后續(xù)任務(wù)將會(huì)根據(jù)來(lái)進(jìn)行拒絕策略處理。線(xiàn)程池工作原則當(dāng)線(xiàn)程池中線(xiàn)程數(shù)量小于則創(chuàng)建線(xiàn)程,并處理請(qǐng)求。當(dāng)線(xiàn)程池中的數(shù)量等于最大線(xiàn)程數(shù)時(shí)默默丟棄不能執(zhí)行的新加任務(wù),不報(bào)任何異常。 spring-cache使用記錄 spring-cache的使用記錄,坑點(diǎn)記錄以及采用的解決方案 深入分析 java 線(xiàn)程池的實(shí)現(xiàn)原理 在這篇文章中,作者有條不紊的將 ja...

    roadtogeek 評(píng)論0 收藏0
  • Java線(xiàn)程池從使用到閱讀源碼(3/10)

    摘要:最后,我們會(huì)通過(guò)對(duì)源代碼的剖析深入了解線(xiàn)程池的運(yùn)行過(guò)程和具體設(shè)計(jì),真正達(dá)到知其然而知其所以然的水平。創(chuàng)建線(xiàn)程池既然線(xiàn)程池是一個(gè)類(lèi),那么最直接的使用方法一定是一個(gè)類(lèi)的對(duì)象,例如。單線(xiàn)程線(xiàn)程池單線(xiàn)程線(xiàn)程 我們一般不會(huì)選擇直接使用線(xiàn)程類(lèi)Thread進(jìn)行多線(xiàn)程編程,而是使用更方便的線(xiàn)程池來(lái)進(jìn)行任務(wù)的調(diào)度和管理。線(xiàn)程池就像共享單車(chē),我們只要在我們有需要的時(shí)候去獲取就可以了。甚至可以說(shuō)線(xiàn)程池更棒,...

    468122151 評(píng)論0 收藏0
  • 線(xiàn)程池,這一篇或許就夠了

    摘要:創(chuàng)建方法最大線(xiàn)程數(shù)即源碼單線(xiàn)程化的線(xiàn)程池有且僅有一個(gè)工作線(xiàn)程執(zhí)行任務(wù)所有任務(wù)按照指定順序執(zhí)行,即遵循隊(duì)列的入隊(duì)出隊(duì)規(guī)則創(chuàng)建方法源碼還有一個(gè)結(jié)合了和,就不介紹了,基本不用。 *本篇文章已授權(quán)微信公眾號(hào) guolin_blog (郭霖)獨(dú)家發(fā)布 為什么用線(xiàn)程池 創(chuàng)建/銷(xiāo)毀線(xiàn)程伴隨著系統(tǒng)開(kāi)銷(xiāo),過(guò)于頻繁的創(chuàng)建/銷(xiāo)毀線(xiàn)程,會(huì)很大程度上影響處理效率 >例如: > >記創(chuàng)建線(xiàn)程消耗時(shí)間T1,執(zhí)行...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<