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

Java ExecutorService四種線程池使用詳解

 更新時間:2018年02月10日 10:03:55   作者:木子道_  
這篇文章主要介紹了Java ExecutorService四種線程池使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1.引言

合理利用線程池能夠帶來三個好處。第一:降低資源消耗。通過重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。第二:提高響應(yīng)速度。當(dāng)任務(wù)到達時,任務(wù)可以不需要的等到線程創(chuàng)建就能立即執(zhí)行。第三:提高線程的可管理性。線程是稀缺資源,如果無限制的創(chuàng)建,不僅會消耗系統(tǒng)資源,還會降低系統(tǒng)的穩(wěn)定性,使用線程池可以進行統(tǒng)一的分配,調(diào)優(yōu)和監(jiān)控。但是要做到合理的利用線程池,必須對其原理了如指掌。

2.線程池使用

Executors提供的四種線程 1.newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。 2.newFixedThreadPool 創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。 3.newScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時及周期性任務(wù)執(zhí)行。 4.newSingleThreadExecutor 創(chuàng)建一個單線程化的線程池,它只會用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級)執(zhí)行。

1.newCachedThreadPool創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例如下

ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0;i<5;i++){
  final int index = i;
  try {
    Thread.sleep(index * 1000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  executorService.execute(new Runnable() {
    @Override
    public void run() {
      System.out.println(Thread.currentThread().getName() + "," +index);
    }
  });
}
//控制臺信息
pool-1-thread-1,0
pool-1-thread-1,1
pool-1-thread-1,2
pool-1-thread-1,3
pool-1-thread-1,4

2.newFixedThreadPool創(chuàng)建一個定長線程池,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待。示例如下

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
for(int i=0;i<5;i++) {
  final int index = i;
    fixedThreadPool.execute(new Runnable() {
    @Override
    public void run() {
      try {
        System.out.println(Thread.currentThread().getName() + ", " + index);
        Thread.sleep(2000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  });
}
//控制臺信息
pool-1-thread-1,0
pool-1-thread-2,1
pool-1-thread-3,2
pool-1-thread-4,3
pool-1-thread-1,4

3.newScheduledThreadPool 創(chuàng)建一個定長線程池,支持周期和定時任務(wù)示例如下

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
System.out.println("before:" + System.currentTimeMillis()/1000);
scheduledThreadPool.schedule(new Runnable() {
  @Override
  public void run() {
    System.out.println("延遲3秒執(zhí)行的哦 :" + System.currentTimeMillis()/1000);
  }
}, 3, TimeUnit.SECONDS);
System.out.println("after :" +System.currentTimeMillis()/1000);
//控制臺信息
before:1518012703
after :1518012703
延遲3秒執(zhí)行的哦 :1518012706
System.out.println("before:" + System.currentTimeMillis()/1000);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
  @Override
  public void run() {
    System.out.println("延遲1秒之后,3秒執(zhí)行一次:" +System.currentTimeMillis()/1000);
  }
}, 1, 3, TimeUnit.SECONDS);
System.out.println("after :" +System.currentTimeMillis()/1000);

控制臺消息
before:1518013024
after :1518013024
延遲1秒之后,3秒執(zhí)行一次:1518013025
延遲1秒之后,3秒執(zhí)行一次:1518013028
延遲1秒之后,3秒執(zhí)行一次:1518013031

4.newSingleThreadExecutor創(chuàng)建一個單線程化的線程池,只會用工作線程來執(zhí)行任務(wù),保證順序,示例如下

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i=0;i<10;i++) {
  final int index = i;
  singleThreadExecutor.execute(new Runnable() {
    @Override
    public void run() {
      try {
         System.out.println(Thread.currentThread().getName() + "," + index);
        Thread.sleep(2000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  });
}

控制臺信息
pool-1-thread-1,0
pool-1-thread-1,1
pool-1-thread-1,2
pool-1-thread-1,3
pool-1-thread-1,4

向線程池提交任務(wù) ThreadPoolExecutor類中execute()和submit()區(qū)別 execute()方法實際上是Executor中聲明的方法,在ThreadPoolExecutor進行了具體的實現(xiàn),這個方法是ThreadPoolExecutor的核心方法,通過這個方法可以向線程池提交一個任務(wù),交由線程池去執(zhí)行。

submit()方法是在ExecutorService中聲明的方法,在AbstractExecutorService就已經(jīng)有了具體的實現(xiàn),在ThreadPoolExecutor中并沒有對其進行重寫,這個方法也是用來向線程池提交任務(wù)的,但是它和execute()方法不同,它能夠返回任務(wù)執(zhí)行的結(jié)果,通過源碼查看submit()方法的實現(xiàn),會發(fā)現(xiàn)它實際上還是調(diào)用的execute()方法,只不過它利用了Future來獲取任務(wù)執(zhí)行結(jié)果。

/**
 * @throws RejectedExecutionException {@inheritDoc}
 * @throws NullPointerException    {@inheritDoc}
 */
public Future<?> submit(Runnable task) {
  if (task == null) throw new NullPointerException();
  RunnableFuture<Void> ftask = newTaskFor(task, null);
  execute(ftask);
  return ftask;
}

線程池的關(guān)閉 我們可以通過調(diào)用線程池的shutdown或shutdownNow方法來關(guān)閉線程池,但是它們的實現(xiàn)原理不同,shutdown的原理是只是將線程池的狀態(tài)設(shè)置成SHUTDOWN狀態(tài),然后中斷所有沒有正在執(zhí)行任務(wù)的線程。shutdownNow的原理是遍歷線程池中的工作線程,然后逐個調(diào)用線程的interrupt方法來中斷線程,所以無法響應(yīng)中斷的任務(wù)可能永遠無法終止。shutdownNow會首先將線程池的狀態(tài)設(shè)置成STOP,然后嘗試停止所有的正在執(zhí)行或暫停任務(wù)的線程,并返回等待執(zhí)行任務(wù)的列表。

只要調(diào)用了這兩個關(guān)閉方法的其中一個,isShutdown方法就會返回true。當(dāng)所有的任務(wù)都已關(guān)閉后,才表示線程池關(guān)閉成功,這時調(diào)用isTerminaed方法會返回true。至于我們應(yīng)該調(diào)用哪一種方法來關(guān)閉線程池,應(yīng)該由提交到線程池的任務(wù)特性決定,通常調(diào)用shutdown來關(guān)閉線程池,如果任務(wù)不一定要執(zhí)行完,則可以調(diào)用shutdownNow。

3.  線程池的分析

流程分析:線程池的主要工作流程如下圖: Java線程池主要工作流程

從上圖我們可以看出,當(dāng)提交一個新任務(wù)到線程池時,線程池的處理流程如下:

  1. 首先線程池判斷基本線程池是否已滿?沒滿,創(chuàng)建一個工作線程來執(zhí)行任務(wù)。滿了,則進入下個流程。
  2. 其次線程池判斷工作隊列是否已滿?沒滿,則將新提交的任務(wù)存儲在工作隊列里。滿了,則進入下個流程。
  3. 最后線程池判斷整個線程池是否已滿?沒滿,則創(chuàng)建一個新的工作線程來執(zhí)行任務(wù),滿了,則交給飽和策略來處理這個任務(wù)。

**源碼分析。**上面的流程分析讓我們很直觀的了解的線程池的工作原理,讓我們再通過源代碼來看看是如何實現(xiàn)的。線程池執(zhí)行任務(wù)的方法如下:

public void execute(Runnable command) {
  if (command == null)
    throw new NullPointerException();
  int c = ctl.get();
  if (workerCountOf(c) < corePoolSize) {
    if (addWorker(command, true))
      return;
    c = ctl.get();
  }
  if (isRunning(c) && workQueue.offer(command)) {
    int recheck = ctl.get();
    if (! isRunning(recheck) && remove(command))
      reject(command);
    else if (workerCountOf(recheck) == 0)
      addWorker(null, false);
  }
  else if (!addWorker(command, false))
    reject(command);
}

工作線程。線程池創(chuàng)建線程時,會將線程封裝成工作線程Worker,Worker在執(zhí)行完任務(wù)后,還會無限循環(huán)獲取工作隊列里的任務(wù)來執(zhí)行。

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

相關(guān)文章

  • Java與WebUploader相結(jié)合實現(xiàn)文件上傳功能(實例代碼)

    Java與WebUploader相結(jié)合實現(xiàn)文件上傳功能(實例代碼)

    這篇文章主要介紹了Java結(jié)合WebUploader實現(xiàn)文件上傳功能,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-03-03
  • java實現(xiàn)導(dǎo)出數(shù)據(jù)為zip壓縮文件

    java實現(xiàn)導(dǎo)出數(shù)據(jù)為zip壓縮文件

    這篇文章主要為大家詳細介紹了java如何實現(xiàn)導(dǎo)出數(shù)據(jù)為zip壓縮文件,并且解壓后為json文件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-11-11
  • Java圖像處理工具類

    Java圖像處理工具類

    這里給大家分享了一個java常用的圖像處理工具類,包含縮放圖像、切割圖像、圖像類型轉(zhuǎn)換、彩色轉(zhuǎn)黑白、文字水印、圖片水印等,有需要的小伙伴參考下。
    2015-02-02
  • Java實現(xiàn)推箱子游戲

    Java實現(xiàn)推箱子游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)推箱子游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java集合之Disruptor操作示例

    Java集合之Disruptor操作示例

    這篇文章主要為大家介紹了Java集合之Disruptor操作示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Springboot集成restTemplate過程詳解

    Springboot集成restTemplate過程詳解

    這篇文章主要介紹了Springboot集成restTemplate過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot實現(xiàn)定時任務(wù)和異步調(diào)用

    SpringBoot實現(xiàn)定時任務(wù)和異步調(diào)用

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)定時任務(wù)和異步調(diào)用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java多種方式動態(tài)生成doc文檔

    Java多種方式動態(tài)生成doc文檔

    這篇文章主要為大家詳細介紹了Java動態(tài)生成doc文檔的多種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • java對象的序列化和反序列化

    java對象的序列化和反序列化

    這篇文章主要為大家詳細介紹了java對象的序列化和反序列化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • java基于包結(jié)構(gòu)的請求路由實現(xiàn)實例分享

    java基于包結(jié)構(gòu)的請求路由實現(xiàn)實例分享

    基于包結(jié)構(gòu)的請求路由簡單實現(xiàn)實例分享,大家參考使用吧
    2013-12-12

最新評論

红河县| 台州市| 兴安盟| 龙里县| 和林格尔县| 新郑市| 南丰县| 安化县| 文水县| 永嘉县| 昌乐县| 莱州市| 贵定县| 沧源| 茂名市| 镶黄旗| 侯马市| 浦北县| 怀安县| 襄垣县| 西乌| 辉南县| 正蓝旗| 洪洞县| 托里县| 沽源县| 楚雄市| 陆川县| 洞头县| 平定县| 图木舒克市| 黄陵县| 托克逊县| 旬阳县| 阜康市| 桂东县| 和林格尔县| 且末县| 宜章县| 南皮县| 田东县|