欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java ExecutorService使用方法詳解

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

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

例子:

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() { 
  // 如果主線程包含這個線程就一直運行 
  while (MainThread.threadNameMap.containsKey(this.getName())) { 
   try { 
    System.out.println("線程名稱:-----" + this.getName()); 
    TimeUnit.SECONDS.sleep(4); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
  System.out.println("***************線程結束,線程名稱:*********" + 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); 
 // 用來存儲線程名稱的map 
 public static Map<String, String> threadNameMap = new HashMap<String, String>(); 
  
 public static void main(String[] args) { 
  // 向線程池中插入 10 個線程,但是線程池只允許最大 5 個線程,所以其他 5 個線程等待中 
  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("主線程睡一會!"); 
   TimeUnit.SECONDS.sleep(3); 
  } catch (Exception e) { 
   e.printStackTrace(); 
   System.out.println("醒了!"); 
  } 
   
    // 下面的這幾個用來刪除線程池里面的線程 
  //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; 
 } 
  
} 

直接運行代碼結果:

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

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

去掉注釋之后代碼運行結果:

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

結論:
從結果中可以看出,在移除線程之前,運行的線程還是從thread0到thread4。當移除線程thread0后,新的線程thread3開始運行,而且是按照順序到threadname7。

總結如下:

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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 關于Spring的@Transaction導致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    關于Spring的@Transaction導致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    使用@Transactional一鍵開啟聲明式事務, 這就真的事務生效了?過于信任框架總有“意外驚喜”。本文通過案例給大家詳解關于Spring的@Transaction導致數(shù)據(jù)庫回滾全部生效問題,感興趣的朋友一起看看吧
    2021-05-05
  • Spring中@EnableScheduling注解的工作原理詳解

    Spring中@EnableScheduling注解的工作原理詳解

    這篇文章主要介紹了Spring中@EnableScheduling注解的工作原理詳解,@EnableScheduling是 Spring Framework 提供的一個注解,用于啟用Spring的定時任務(Scheduling)功能,需要的朋友可以參考下
    2024-01-01
  • Java并發(fā)編程之Fork/Join框架的理解

    Java并發(fā)編程之Fork/Join框架的理解

    今天帶大家學習Java并發(fā)編程的相關知識,文中對Fork/Join框架作了非常詳細的介紹,對正在學習有關知識的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • java安全?ysoserial?CommonsCollections1示例解析

    java安全?ysoserial?CommonsCollections1示例解析

    這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn)

    IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn)

    初學者,想自己動手做一個簡單的demo,本文主要介紹了IDEA整合Dubbo+Zookeeper+SpringBoot實現(xiàn),需要的朋友們下面隨著小編來一起學習學習吧
    2021-06-06
  • Java并發(fā)編程中的ReentrantLock詳解

    Java并發(fā)編程中的ReentrantLock詳解

    這篇文章主要介紹了Java并發(fā)編程中的ReentrantLock詳解,從Java 5 開始,引入了一個高級的處理并發(fā)的java.util.concurrent包,它提供了大量更高級的并發(fā)功能,能大大簡化多線程程序的編寫,需要的朋友可以參考下
    2023-11-11
  • Spring使用@Autowired為抽象父類注入依賴代碼實例

    Spring使用@Autowired為抽象父類注入依賴代碼實例

    這篇文章主要介紹了Spring使用@Autowired為抽象父類注入依賴代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • Java的Comparable,Comparator和Cloneable三大接口詳解

    Java的Comparable,Comparator和Cloneable三大接口詳解

    這篇文章主要為大家詳細介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java底層AQS實現(xiàn)類ReentrantLock鎖的構成及源碼解析

    java底層AQS實現(xiàn)類ReentrantLock鎖的構成及源碼解析

    本章我們就要來學習一下第一個?AQS?的實現(xiàn)類:ReentrantLock,看看其底層是如何組合?AQS?,實現(xiàn)了自己的那些功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java中的WeakHashMap源碼分析

    Java中的WeakHashMap源碼分析

    這篇文章主要介紹了Java中的WeakHashMap源碼分析,WeakHashMap可能平時使用的頻率并不高,但是你可能聽過WeakHashMap會進行自動回收吧,下面就對其原理進行分析,需要的朋友可以參考下
    2023-09-09

最新評論