欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java線程池隊(duì)列代碼,Java線程池代碼

java線程池(一) 簡述線程池的幾種使用方式

首先說明下java線程是如何實(shí)現(xiàn)線程重用的

公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出儀征免費(fèi)做網(wǎng)站回饋大家。

1. 線程執(zhí)行完一個(gè)Runnable的run()方法后,不會(huì)被殺死

2. 當(dāng)線程被重用時(shí),這個(gè)線程會(huì)進(jìn)入新Runnable對(duì)象的run()方法12

java線程池由Executors提供的幾種靜態(tài)方法創(chuàng)建線程池。下面通過代碼片段簡單介紹下線程池的幾種實(shí)現(xiàn)方式。后續(xù)會(huì)針對(duì)每個(gè)實(shí)現(xiàn)方式做詳細(xì)的說明

newFixedThreadPool

創(chuàng)建一個(gè)固定大小的線程池

添加的任務(wù)達(dá)到線程池的容量之后開始加入任務(wù)隊(duì)列開始線程重用總共開啟線程個(gè)數(shù)跟指定容量相同。

@Test

public void newFixedThreadPool() throws Exception {

ExecutorService executorService = Executors.newFixedThreadPool(1);

executorService = Executors.newFixedThreadPool(1, new ThreadFactoryBuilder().build());

RunThread run1 = new RunThread("run 1");

executorService.execute(run1);

executorService.shutdown();

}12345678

newSingleThreadExecutor

僅支持單線程順序處理任務(wù)

@Test

public void newSingleThreadExecutor() throws Exception {

ExecutorService executorService = Executors.newSingleThreadExecutor();

executorService = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().build());

executorService.execute(new RunThread("run 1"));

executorService.execute(new RunThread("run 2"));

executorService.shutdown();

}123456789

newCachedThreadPool

這種情況跟第一種的方式類似,不同的是這種情況線程池容量上線是Integer.MAX_VALUE 并且線程池開啟緩存60s

@Test

public void newCachedThreadPool() throws Exception {

ExecutorService executorService = Executors.newCachedThreadPool();

executorService = Executors.newCachedThreadPool(new ThreadFactoryBuilder().build());

executorService.execute(new RunThread("run 1"));

executorService.execute(new RunThread("run 2"));

executorService.shutdown();

}123456789

newWorkStealingPool

支持給定的并行級(jí)別,并且可以使用多個(gè)隊(duì)列來減少爭用。

@Test

public void newWorkStealingPool() throws Exception {

ExecutorService executorService = Executors.newWorkStealingPool();

executorService = Executors.newWorkStealingPool(1);

RunThread run1 = new RunThread("run 1");

executorService.execute(run1);

executorService.shutdown();

}123456789

newScheduledThreadPool

看到的現(xiàn)象和第一種相同,也是在線程池滿之前是新建線程,然后開始進(jìn)入任務(wù)隊(duì)列,進(jìn)行線程重用

支持定時(shí)周期執(zhí)行任務(wù)(還沒有看完)

@Test

public void newScheduledThreadPool() throws Exception {

ExecutorService executorService = Executors.newScheduledThreadPool(1);

executorService = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().build());

executorService.execute(new RunThread("run 1"));

executorService.execute(new RunThread("run 2"));

executorService.shutdown();

}

線程池-參數(shù)篇:2.隊(duì)列

多線程環(huán)境中,通過隊(duì)列可以很容易實(shí)現(xiàn)線程間數(shù)據(jù)共享,比如經(jīng)典的“生產(chǎn)者”和“消費(fèi)者”模型中,通過隊(duì)列可以很便利地實(shí)現(xiàn)兩者之間的數(shù)據(jù)共享;同時(shí)作為BlockingQueue的使用者,我們不需要關(guān)心什么時(shí)候需要阻塞線程,什么時(shí)候需要喚醒線程,因?yàn)檫@一切BlockingQueue的實(shí)現(xiàn)者都給一手包辦了。

基于數(shù)組的阻塞隊(duì)列實(shí)現(xiàn),在ArrayBlockingQueue內(nèi)部,維護(hù)了一個(gè)定長數(shù)組,以便緩存隊(duì)列中的數(shù)據(jù)對(duì)象,另外還保存著兩個(gè)整形變量,分別標(biāo)識(shí)著隊(duì)列的頭部和尾部在數(shù)組中的位置。

ArrayBlockingQueue在生產(chǎn)者放入數(shù)據(jù)和消費(fèi)者獲取數(shù)據(jù),都是共用同一個(gè)鎖對(duì)象,由此也意味著兩者無法真正并行運(yùn)行,而在創(chuàng)建ArrayBlockingQueue時(shí),我們還可以控制對(duì)象的內(nèi)部鎖是否采用公平鎖,默認(rèn)采用非公平鎖。

按照實(shí)現(xiàn)原理來分析,ArrayBlockingQueue完全可以采用分離鎖,從而實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者操作的完全并行運(yùn)行。

基于鏈表的阻塞隊(duì)列,其內(nèi)部也維持著一個(gè)數(shù)據(jù)緩沖隊(duì)列(由一個(gè)鏈表構(gòu)成),當(dāng)生產(chǎn)者往隊(duì)列中放入一個(gè)數(shù)據(jù)時(shí),隊(duì)列會(huì)從生產(chǎn)者手中獲取數(shù)據(jù),并緩存在隊(duì)列內(nèi)部,而生產(chǎn)者立即返回;只有當(dāng)隊(duì)列緩沖區(qū)達(dá)到最大值緩存容量時(shí)(LinkedBlockingQueue可以通過構(gòu)造函數(shù)指定該值),才會(huì)阻塞生產(chǎn)者隊(duì)列,直到消費(fèi)者從隊(duì)列中消費(fèi)掉一份數(shù)據(jù),生產(chǎn)者線程會(huì)被喚醒,反之對(duì)于消費(fèi)者這端的處理也基于同樣的原理。

對(duì)于生產(chǎn)者端和消費(fèi)者端分別采用了獨(dú)立的鎖來控制數(shù)據(jù)同步,這也意味著在高并發(fā)的情況下生產(chǎn)者和消費(fèi)者可以并行地操作隊(duì)列中的數(shù)據(jù),以此來提高整個(gè)隊(duì)列的并發(fā)性能。

ArrayBlockingQueue和LinkedBlockingQueue間還有一個(gè)明顯的不同之處在于,前者在插入或刪除元素時(shí)不會(huì)產(chǎn)生或銷毀任何額外的對(duì)象實(shí)例,而后者則會(huì)生成一個(gè)額外的Node對(duì)象。這在長時(shí)間內(nèi)需要高效并發(fā)地處理大批量數(shù)據(jù)的系統(tǒng)中,其對(duì)于GC的影響還是存在一定的區(qū)別。如果沒有指定其容量大小,LinkedBlockingQueue會(huì)默認(rèn)一個(gè)類似無限大小的容量(Integer.MAX_VALUE),這樣的話,如果生產(chǎn)者的速度一旦大于消費(fèi)者的速度,也許還沒有等到隊(duì)列滿阻塞產(chǎn)生,系統(tǒng)內(nèi)存就有可能已被消耗殆盡了。

ArrayBlockingQueue和LinkedBlockingQueue是兩個(gè)最普通也是最常用的阻塞隊(duì)列,一般情況下,在處理多線程間的生產(chǎn)者消費(fèi)者問題,使用這兩個(gè)類足以。

DelayQueue中的元素只有當(dāng)其指定的延遲時(shí)間到了,才能夠從隊(duì)列中獲取到該元素。DelayQueue是一個(gè)沒有大小限制的隊(duì)列,因此往隊(duì)列中插入數(shù)據(jù)的操作(生產(chǎn)者)永遠(yuǎn)不會(huì)被阻塞,而只有獲取數(shù)據(jù)的操作(消費(fèi)者)才會(huì)被阻塞。

DelayQueue用于放置實(shí)現(xiàn)了Delayed接口的對(duì)象,其中的對(duì)象只能在其到期時(shí)才能從隊(duì)列中取走。這種隊(duì)列是有序的,即隊(duì)頭對(duì)象的延遲到期時(shí)間最長。注意:不能將null元素放置到這種隊(duì)列中。

Delayed 是一種混合風(fēng)格的接口,用來標(biāo)記那些應(yīng)該在給定延遲時(shí)間之后執(zhí)行的對(duì)象。Delayed擴(kuò)展了Comparable接口,比較的基準(zhǔn)為延時(shí)的時(shí)間值,Delayed接口的實(shí)現(xiàn)類getDelay的返回值應(yīng)為固定值(final)。DelayQueue內(nèi)部是使用PriorityQueue實(shí)現(xiàn)的。

考慮以下場景:

一種笨笨的辦法就是,使用一個(gè)后臺(tái)線程,遍歷所有對(duì)象,挨個(gè)檢查。這種笨笨的辦法簡單好用,但是對(duì)象數(shù)量過多時(shí),可能存在性能問題,檢查間隔時(shí)間不好設(shè)置,間隔時(shí)間過大,影響精確度,多小則存在效率問題。而且做不到按超時(shí)的時(shí)間順序處理。

這場景,使用DelayQueue最適合了,詳情查看 DelayedQueue學(xué)習(xí)筆記 ; 精巧好用的DelayQueue

基于優(yōu)先級(jí)的阻塞隊(duì)列(優(yōu)先級(jí)的判斷通過構(gòu)造函數(shù)傳入的Compator對(duì)象來決定),需要注意PriorityBlockingQueue并不會(huì)阻塞數(shù)據(jù)生產(chǎn)者,而只會(huì)在沒有可消費(fèi)的數(shù)據(jù)時(shí),阻塞數(shù)據(jù)的消費(fèi)者。

使用時(shí),若生產(chǎn)者生產(chǎn)數(shù)據(jù)的速度快于消費(fèi)者消費(fèi)數(shù)據(jù)的速度,隨著長時(shí)間的運(yùn)行,可能會(huì)耗盡所有的可用堆內(nèi)存空間。在實(shí)現(xiàn)PriorityBlockingQueue時(shí),內(nèi)部控制線程同步的鎖采用的是公平鎖。

SynchronousQueue是一個(gè)內(nèi)部只能包含零個(gè)元素的隊(duì)列。插入元素到隊(duì)列的線程被阻塞,直到另一個(gè)線程從隊(duì)列中獲取元素。同樣,如果線程嘗試獲取元素并且當(dāng)前沒有線程在插入元素,則該線程將被阻塞,直到有線程將元素插入隊(duì)列

聲明一個(gè)SynchronousQueue有公平模式和非公平模式,區(qū)別如下:

參考: Java多線程-工具篇-BlockingQueue

12. SynchronousQueue

Java中關(guān)于如何實(shí)現(xiàn)多線程消息隊(duì)列的實(shí)例

java中的消息隊(duì)列

消息隊(duì)列是線程間通訊的手段:

import java.util.*

public class MsgQueue{

private Vector queue = null;

public MsgQueue(){

queue = new Vector();

}

public synchronized void send(Object o)

{

queue.addElement(o);

}

public synchronized Object recv()

{

if(queue.size()==0)

return null;

Object o = queue.firstElement();

queue.removeElementAt(0);//or queue[0] = null can also work

return o;

}

}

因?yàn)閖ava中是locked by object的所以添加synchronized 就可以用于線程同步鎖定對(duì)象

可以作為多線程處理多任務(wù)的存放task的隊(duì)列。他的client包括封裝好的task類以及thread類

Java的多線程-線程間的通信2009-08-25 21:58

1. 線程的幾種狀態(tài)

線程有四種狀態(tài),任何一個(gè)線程肯定處于這四種狀態(tài)中的一種:

1) 產(chǎn)生(New):線程對(duì)象已經(jīng)產(chǎn)生,但尚未被啟動(dòng),所以無法執(zhí)行。如通過new產(chǎn)生了一個(gè)線程對(duì)象后沒對(duì)它調(diào)用start()函數(shù)之前。

2) 可執(zhí)行(Runnable):每個(gè)支持多線程的系統(tǒng)都有一個(gè)排程器,排程器會(huì)從線程池中選擇一個(gè)線程并啟動(dòng)它。當(dāng)一個(gè)線程處于可執(zhí)行狀態(tài)時(shí),表示它可能正處于線程池中等待排排程器啟動(dòng)它;也可能它已正在執(zhí)行。如執(zhí)行了一個(gè)線程對(duì)象的start()方法后,線程就處于可執(zhí)行狀態(tài),但顯而易見的是此時(shí)線程不一定正在執(zhí)行中。

3) 死亡(Dead):當(dāng)一個(gè)線程正常結(jié)束,它便處于死亡狀態(tài)。如一個(gè)線程的run()函數(shù)執(zhí)行完畢后線程就進(jìn)入死亡狀態(tài)。

4) 停滯(Blocked):當(dāng)一個(gè)線程處于停滯狀態(tài)時(shí),系統(tǒng)排程器就會(huì)忽略它,不對(duì)它進(jìn)行排程。當(dāng)處于停滯狀態(tài)的線程重新回到可執(zhí)行狀態(tài)時(shí),它有可能重新執(zhí)行。如通過對(duì)一個(gè)線程調(diào)用wait()函數(shù)后,線程就進(jìn)入停滯狀態(tài),只有當(dāng)兩次對(duì)該線程調(diào)用notify或notifyAll后它才能兩次回到可執(zhí)行狀態(tài)。

2. class Thread下的常用函數(shù)函數(shù)

2.1 suspend()、resume()

1) 通過suspend()函數(shù),可使線程進(jìn)入停滯狀態(tài)。通過suspend()使線程進(jìn)入停滯狀態(tài)后,除非收到resume()消息,否則該線程不會(huì)變回可執(zhí)行狀態(tài)。

2) 當(dāng)調(diào)用suspend()函數(shù)后,線程不會(huì)釋放它的“鎖標(biāo)志”。

例11:

class TestThreadMethod extends Thread{

public static int shareVar = 0;

public TestThreadMethod(String name){

super(name);

}

public synchronized void run(){

if(shareVar==0){

for(int i=0; i5; i++){

shareVar++;

if(shareVar==5){

this.suspend(); //(1)

}}}

else{

System.out.print(Thread.currentThread().getName());

System.out.println(" shareVar = " + shareVar);

this.resume(); //(2)

}}

}

public class TestThread{

public static void main(String[] args){

TestThreadMethod t1 = new TestThreadMethod("t1");

TestThreadMethod t2 = new TestThreadMethod("t2");

t1.start(); //(5)

//t1.start(); //(3)

t2.start(); //(4)

}}

Java的線程池,如何設(shè)定保留的最小線程數(shù)和固定的隊(duì)列容量

創(chuàng)建一個(gè)可重用固定線程數(shù)的線程池,以共享的無界隊(duì)列方式來運(yùn)行這些線程。在任意點(diǎn),在大多數(shù) nThreads 線程會(huì)處于處理任務(wù)的活動(dòng)狀態(tài)。如果在所有線程處于活動(dòng)狀態(tài)時(shí)提交附加任務(wù),則在有可用線程之前,附加任務(wù)將在隊(duì)列中等待。如果在關(guān)閉前的執(zhí)行期間由于失敗而導(dǎo)致任何線程終止,那么一個(gè)新線程將代替它執(zhí)行后續(xù)的任務(wù)(如果需要)。在某個(gè)線程被顯式地關(guān)閉之前,池中的線程將一直存在。

看代碼:

Java代碼 收藏代碼

package test;

import java.util.Random;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

public class ExecutorTest {

public static void main(String args[]) {

Random random = new Random();

//產(chǎn)生一個(gè) ExecutorService 對(duì)象,這個(gè)對(duì)象帶有一個(gè)大小為 poolSize 的線程池,若任務(wù)數(shù)量大于 poolSize ,任務(wù)會(huì)被放在一個(gè) queue 里順序執(zhí)行。

ExecutorService executor = Executors.newFixedThreadPool(3);

// 判斷可是線程池可以結(jié)束

int waitTime = 500;

for (int i = 0; i 10; i++) {

String name = "線程 " + i;

int time = random.nextInt(1000);

waitTime += time;

Runnable runner = new ExecutorThread(name, time);

System.out.println("增加: " + name + " / " + time);

executor.execute(runner);

}

try {

Thread.sleep(waitTime);

executor.shutdown();

executor.awaitTermination(waitTime, TimeUnit.MILLISECONDS);

} catch (InterruptedException ignored) {

}

}

}

class ExecutorThread implements Runnable {

private final String name;

private final int delay;

public ExecutorThread(String name, int delay) {

this.name = name;

this.delay = delay;

}

public void run() {

System.out.println("啟動(dòng): " + name);

try {

Thread.sleep(delay);

} catch (InterruptedException ignored) {

}

System.out.println("完成: " + name);

}

}

分享標(biāo)題:java線程池隊(duì)列代碼,Java線程池代碼
分享路徑:http://chinadenli.net/article24/hedece.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)品牌網(wǎng)站設(shè)計(jì)微信小程序營銷型網(wǎng)站建設(shè)App開發(fā)面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)