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

java ExecutorService使用方法詳解

 更新時(shí)間:2016年12月01日 11:39:40   作者:tengdazhang770960436  
這篇文章主要為大家詳細(xì)介紹了java ExecutorService使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

下面的例子主要討論兩個(gè)問(wèn)題:
問(wèn)題1.線程池固定大小,假設(shè)為5.那么向線程池放入10個(gè)線程,運(yùn)行效果如何?其他線程的狀態(tài)?
問(wèn)題2.那么如何從線程池中移除某一個(gè)線程,確切說(shuō)是使某一個(gè)線程成為空閑線程?

例子:

package com.dada.executorService; 
 
import java.util.concurrent.TimeUnit; 
 
public class JobThread extends Thread { 
  
 // 為線程命名 
 public JobThread(String name,long threadId) { 
  super(name); 
 } 
  
 @Override 
 public void run() { 
  // 如果主線程包含這個(gè)線程就一直運(yùn)行 
  while (MainThread.threadNameMap.containsKey(this.getName())) { 
   try { 
    System.out.println("線程名稱:-----" + this.getName()); 
    TimeUnit.SECONDS.sleep(4); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
  System.out.println("***************線程結(jié)束,線程名稱:*********" + this.getName()); 
 } 
} 
package com.dada.executorService; 
 
import java.util.HashMap; 
import java.util.Map; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 
 
public class MainThread { 
 public static final int THREADPOOL_SIZE = 5; 
 // 生成固定大小的線程池 
 public static ExecutorService exec = Executors.newFixedThreadPool(THREADPOOL_SIZE); 
 // 用來(lái)存儲(chǔ)線程名稱的map 
 public static Map<String, String> threadNameMap = new HashMap<String, String>(); 
  
 public static void main(String[] args) { 
  // 向線程池中插入 10 個(gè)線程,但是線程池只允許最大 5 個(gè)線程,所以其他 5 個(gè)線程等待中 
  for (int i = 0; i < THREADPOOL_SIZE + 5; i++) { 
   String threadName = getThreadName(i); 
   threadNameMap.put(threadName, threadName); 
   exec.execute(new JobThread(threadName, i)); 
  } 
   
  System.out.println("Hash表的Size:" + threadNameMap.size()); 
   
  try { 
   System.out.println("主線程睡一會(huì)!"); 
   TimeUnit.SECONDS.sleep(3); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   System.out.println("醒了!"); 
  } 
   
    // 下面的這幾個(gè)用來(lái)刪除線程池里面的線程 
  //removeThread(0); 
  //removeThread(1); 
  //removeThread(2); 
 } 
  
 public static void removeThread(int i) { 
  threadNameMap.remove(getThreadName(i)); 
  System.out.println("刪除線程Thread" + i + ", Hash表的Size:" + threadNameMap.size()); 
 } 
  
 public static String getThreadName(int i) { 
  return "threadname"+i; 
 } 
  
} 

直接運(yùn)行代碼結(jié)果:

線程名稱:-----threadname0
Hash表的Size:10
主線程睡一會(huì)!
線程名稱:-----threadname2
線程名稱:-----threadname4
線程名稱:-----threadname1
線程名稱:-----threadname3
線程名稱:-----threadname4
線程名稱:-----threadname2
線程名稱:-----threadname3
線程名稱:-----threadname1
線程名稱:-----threadname0
線程名稱:-----threadname1
線程名稱:-----threadname3
線程名稱:-----threadname0
線程名稱:-----threadname4
線程名稱:-----threadname2
線程名稱:-----threadname1
線程名稱:-----threadname3
線程名稱:-----threadname4

結(jié)論:
發(fā)現(xiàn)打印的:線程名稱一直從threadname0到threadname4,沒(méi)有其他的名稱。
由此證明:向線程池中放入10個(gè)線程,但是線程池的大小為5,只能給5個(gè)線程分配CPU,運(yùn)行的就是最先放入線程池中的5個(gè)線程,其他線程都處于就緒狀態(tài)(阻塞狀態(tài))。

去掉注釋之后代碼運(yùn)行結(jié)果:

線程名稱:-----threadname0
線程名稱:-----threadname2
線程名稱:-----threadname4
Hash表的Size:10
主線程睡一會(huì)!
線程名稱:-----threadname1
線程名稱:-----threadname3
刪除線程Thread0, Hash表的Size:9
刪除線程Thread1, Hash表的Size:8
刪除線程Thread2, Hash表的Size:7
***************線程結(jié)束,線程名稱:*********threadname2
***************線程結(jié)束,線程名稱:*********threadname0
線程名稱:-----threadname5
線程名稱:-----threadname6
***************線程結(jié)束,線程名稱:*********threadname1
線程名稱:-----threadname4
線程名稱:-----threadname7
線程名稱:-----threadname3
線程名稱:-----threadname6
線程名稱:-----threadname5
線程名稱:-----threadname7
線程名稱:-----threadname4
線程名稱:-----threadname3
線程名稱:-----threadname5
線程名稱:-----threadname6
線程名稱:-----threadname7
線程名稱:-----threadname4
線程名稱:-----threadname3

結(jié)論:
從結(jié)果中可以看出,在移除線程之前,運(yùn)行的線程還是從thread0到thread4。當(dāng)移除線程thread0后,新的線程thread3開(kāi)始運(yùn)行,而且是按照順序到threadname7。

總結(jié)如下:

1.線程池固定大小,假設(shè)為5.那么向線程池放入10個(gè)線程,運(yùn)行效果如何?其他線程的狀態(tài)?
a.線程池的概念就是你不斷的向其中push請(qǐng)求,但是它只能處理規(guī)定額度的線程,多余的線程都會(huì)在其中等待。
b.當(dāng)其中一個(gè)線程處理完畢(業(yè)務(wù)執(zhí)行完畢或退出while循環(huán)),線程池就會(huì)自動(dòng)從等待的隊(duì)列中取出一個(gè)作業(yè),使用空閑的線程來(lái)運(yùn)行這個(gè)作業(yè)。運(yùn)行線程池中的哪個(gè),從例子上來(lái)看應(yīng)該是按照被放入的先后順序來(lái)的。 

2.那么如何從線程池中移除某一個(gè)線程,確切說(shuō)是使某一個(gè)線程成為空閑線程?
線程池?zé)o法獲取其中某一個(gè)線程并殺掉他,因?yàn)槭褂镁€程池的主線程和主線程開(kāi)啟的線程是平級(jí)的,誰(shuí)都無(wú)權(quán)主宰另一方的存亡。但是可以換一個(gè)方式,委婉的達(dá)到目的。
a.主線程維護(hù)一個(gè)Hash表可以是一個(gè)HashMap。key值任意,但是要唯一,可以唯一標(biāo)示一個(gè)線程。
b.所有放入線程池的線程,都要生成一個(gè)key值,然后存入這個(gè)HashMap中。
c.對(duì)于循環(huán)類的線程,如while(true)的線程。需要增加一個(gè)條件,每一輪循環(huán)校驗(yàn)這個(gè)線程的key是否存在于上面HashMap中。如果不存在則退出while循環(huán)。
d.雖然主線程不可以主宰其他線程的存亡,但是可以對(duì)自己的HashMap進(jìn)行put或是remove操作。到此,只要從HashMap中移除線程對(duì)應(yīng)的Key值,這個(gè)線程在下次循環(huán)的時(shí)候就會(huì)自動(dòng)退出了。

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

相關(guān)文章

  • 使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例

    使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例

    這篇文章主要介紹了使用Spring Cloud Feign遠(yuǎn)程調(diào)用的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • SpringCloudGateway路由失效問(wèn)題

    SpringCloudGateway路由失效問(wèn)題

    本文主要分析了SpringCloudGateway整合nacos時(shí)路由失效的問(wèn)題,作者通過(guò)斷點(diǎn)跟蹤發(fā)現(xiàn)在RouteToRequestUrlFilter類中報(bào)錯(cuò),原因是在讀取配置文件的時(shí)候,沒(méi)有解析到對(duì)應(yīng)的host主機(jī),進(jìn)一步發(fā)現(xiàn)這里包含了一段正則表達(dá)式驗(yàn)證,驗(yàn)證配置的服務(wù)名稱是否合法
    2024-10-10
  • 最全JVM調(diào)優(yōu)步驟和參數(shù)及配置

    最全JVM調(diào)優(yōu)步驟和參數(shù)及配置

    這篇文章主要給大家介紹了關(guān)于JVM調(diào)優(yōu)的相關(guān)資料,JVM調(diào)優(yōu)是指對(duì)Java虛擬機(jī)(JVM)進(jìn)行優(yōu)化,以提高Java程序的性能和運(yùn)行效率,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解

    Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解

    這篇文章主要介紹了Spring注解@Resource和@Autowired區(qū)別對(duì)比詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    本文主要介紹了Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明

    這篇文章主要介紹了java調(diào)用shell腳本及注意事項(xiàng)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring Boot獲取微信用戶信息的超簡(jiǎn)單方法

    Spring Boot獲取微信用戶信息的超簡(jiǎn)單方法

    這篇文章主要給大家介紹了關(guān)于Spring Boot獲取微信用戶信息的超簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表

    java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表

    這篇文章主要為大家介紹了java EasyExcel實(shí)現(xiàn)動(dòng)態(tài)列解析和存表示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • java實(shí)戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)詳解

    java實(shí)戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)詳解

    Java.lang.String是Java的字符串類. Srting是一個(gè)不可變對(duì)象,下面這篇文章主要給大家介紹了關(guān)于java實(shí)戰(zhàn)小技巧之字符串與容器互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot中使用Redis對(duì)接口進(jìn)行限流的實(shí)現(xiàn)

    SpringBoot中使用Redis對(duì)接口進(jìn)行限流的實(shí)現(xiàn)

    本文將結(jié)合實(shí)例代碼,介紹SpringBoot中使用Redis對(duì)接口進(jìn)行限流的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評(píng)論

苍南县| 茶陵县| 灌阳县| 大埔区| 江北区| 蓬莱市| 廊坊市| 昌江| 札达县| 沾益县| 宁化县| 紫阳县| 鄄城县| 保山市| 罗江县| 专栏| 杨浦区| 大姚县| 紫阳县| 富民县| 庆城县| 西丰县| 姜堰市| 榆林市| 武威市| 呼图壁县| 三都| 石柱| 平南县| 永新县| 望奎县| 门头沟区| 阿合奇县| 涿鹿县| 凤冈县| 乌海市| 三穗县| 山东省| 灌云县| 镇原县| 城固县|