亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java四種線程池的使用詳解

 更新時(shí)間:2017年08月31日 09:03:12   作者:cuisuqiang  
本篇文章主要介紹了Java四種線程池的使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

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

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

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

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

(1) newCachedThreadPool

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

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  try { 
  Thread.sleep(index * 1000); 
  } catch (InterruptedException e) { 
  e.printStackTrace(); 
  } 
  cachedThreadPool.execute(new Runnable() { 
  public void run() { 
   System.out.println(index); 
  } 
  }); 
 } 
 } 
} 

線程池為無(wú)限大,當(dāng)執(zhí)行第二個(gè)任務(wù)時(shí)第一個(gè)任務(wù)已經(jīng)完成,會(huì)復(fù)用執(zhí)行第一個(gè)任務(wù)的線程,而不用每次新建線程。

(2) newFixedThreadPool

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

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  fixedThreadPool.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
}

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

定長(zhǎng)線程池的大小最好根據(jù)系統(tǒng)資源進(jìn)行設(shè)置。如Runtime.getRuntime().availableProcessors()

(3)  newScheduledThreadPool

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

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.schedule(new Runnable() { 
  public void run() { 
  System.out.println("delay 3 seconds"); 
  } 
 }, 3, TimeUnit.SECONDS); 
 } 
} 

表示延遲3秒執(zhí)行。

定期執(zhí)行示例代碼如下:

package test; 
import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); 
 scheduledThreadPool.scheduleAtFixedRate(new Runnable() { 
  public void run() { 
  System.out.println("delay 1 seconds, and excute every 3 seconds"); 
  } 
 }, 1, 3, TimeUnit.SECONDS); 
 } 
} 

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

(4) newSingleThreadExecutor

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

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); 
 for (int i = 0; i < 10; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   System.out.println(index); 
   Thread.sleep(2000); 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
 } 
 } 
} 

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

你可以使用JDK自帶的監(jiān)控工具來(lái)監(jiān)控我們創(chuàng)建的線程數(shù)量,運(yùn)行一個(gè)不終止的線程,創(chuàng)建指定量的線程,來(lái)觀察:

工具目錄:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe

運(yùn)行程序做稍微修改:

package test; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class ThreadPoolExecutorTest { 
 public static void main(String[] args) { 
 ExecutorService singleThreadExecutor = Executors.newCachedThreadPool(); 
 for (int i = 0; i < 100; i++) { 
  final int index = i; 
  singleThreadExecutor.execute(new Runnable() { 
  public void run() { 
   try { 
   while(true) { 
    System.out.println(index); 
    Thread.sleep(10 * 1000); 
   } 
   } catch (InterruptedException e) { 
   e.printStackTrace(); 
   } 
  } 
  }); 
  try { 
  Thread.sleep(500); 
  } catch (InterruptedException e) { 
  e.printStackTrace(); 
  } 
 } 
 } 
} 

效果如下:

選擇我們運(yùn)行的程序:

監(jiān)控運(yùn)行狀態(tài)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8 LocalDateTime極簡(jiǎn)時(shí)間日期操作小結(jié)

    Java8 LocalDateTime極簡(jiǎn)時(shí)間日期操作小結(jié)

    這篇文章主要介紹了Java8-LocalDateTime極簡(jiǎn)時(shí)間日期操作整理,通過(guò)實(shí)例代碼給大家介紹了java8 LocalDateTime 格式化問(wèn)題,需要的朋友可以參考下
    2020-04-04
  • Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    Mybatis如何實(shí)現(xiàn)延遲加載及緩存

    這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)延遲加載及緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 深入了解MyBatis參數(shù)

    深入了解MyBatis參數(shù)

    今天小編就為大家分享一篇關(guān)于深入了解MyBatis參數(shù),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • kaptcha驗(yàn)證碼使用方法詳解

    kaptcha驗(yàn)證碼使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了kaptcha驗(yàn)證碼的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Spring的同一個(gè)服務(wù)會(huì)加載多次的問(wèn)題分析及解決方法

    Spring的同一個(gè)服務(wù)會(huì)加載多次的問(wèn)題分析及解決方法

    這篇文章主要介紹了Spring的同一個(gè)服務(wù)為什么會(huì)加載多次,我們先來(lái)梳理一下?Web?容器中如何加載?Bean,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-10-10
  • java 線程鎖詳細(xì)介紹及實(shí)例代碼

    java 線程鎖詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了java 線程鎖詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Java打印九九乘法表代碼詳情

    Java打印九九乘法表代碼詳情

    這篇文章主要介紹了Java打印九九乘法表,使用了雙重for循環(huán),使用do{}while()實(shí)現(xiàn)打印九九乘法表這些好玩的語(yǔ)法實(shí)現(xiàn),感興趣的小伙伴可參考下面文章內(nèi)容
    2021-09-09
  • Spring的初始化前中后詳細(xì)解讀

    Spring的初始化前中后詳細(xì)解讀

    這篇文章主要介紹了Spring的初始化前中后詳細(xì)解讀,Spring?框架是一個(gè)非常流行的?Java?框架,它提供了一種輕量級(jí)的、可擴(kuò)展的方式來(lái)構(gòu)建企業(yè)級(jí)應(yīng)用程序,在?Spring?的生命周期中,有三個(gè)重要的階段,即初始化前、初始化、初始化后,需要的朋友可以參考下
    2023-09-09
  • Java?synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯(cuò)誤

    Java?synchornized與ReentrantLock處理并發(fā)出現(xiàn)的錯(cuò)誤

    synchronized機(jī)制提供了對(duì)每個(gè)對(duì)象相關(guān)的隱式監(jiān)視器鎖,并強(qiáng)制所有鎖的獲取和釋放都必須在同一個(gè)塊結(jié)構(gòu)中。當(dāng)獲取了多個(gè)鎖時(shí),必須以相反的順序釋放。即synchronized對(duì)于鎖的釋放是隱式的
    2023-01-01
  • Mybatis和orcale update語(yǔ)句中接收參數(shù)為對(duì)象的實(shí)例代碼

    Mybatis和orcale update語(yǔ)句中接收參數(shù)為對(duì)象的實(shí)例代碼

    Mybatis的 mapper.xml 中 update 語(yǔ)句使用 if 標(biāo)簽判斷對(duì)像屬性是否為空值。本文重點(diǎn)給大家介紹Mybatis和orcale update語(yǔ)句中接收參數(shù)為對(duì)象的實(shí)例代碼,需要的朋友參考下吧
    2017-09-09

最新評(píng)論