1. 程式人生 > >執行緒池ExecutorService 中併發數的(引入訊號量Semaphore)控制執行

執行緒池ExecutorService 中併發數的(引入訊號量Semaphore)控制執行

檢視本機處理器的核心數程式碼:Runtime.getRuntime().availableProcessors()
所以,應用程式的最小執行緒數應該等於可用的處理器核數。如果所有的任務都是計算密集型的,則建立處理器可用的核心數那麼多執行緒就可以了。在這種情況下,建立更多的執行緒對程式效能而言反而是不利的。因為當有多個任務處於就緒狀態時,處理器核心需要線上程間頻繁進行上下文切換,而這種切換對程式效能損耗較大。但如果任務都是IO密集型的,那麼我們就需要開更多的執行緒來提高效能。

當一個任務執行IO操作時,其執行緒將被阻塞,於是處理器可以立即進行上下文的切換以便處理其他就緒執行緒。如果我們只有處理可用核心數那麼多個執行緒的話,則即使有待執行的任務也無法處理,因為我們已經拿不出更多的執行緒供處理器排程了。

如果任務有50%的時間處於阻塞狀態,則程式所需執行緒數為處理器可用核心數的兩倍。如果任務被阻塞的時間少於50%,即這些任務是計算密集型的,則程式所需執行緒數將隨之減少,但最少也不應低於處理器的核心數。如果任務被阻塞的時間大於執行時間,即該任務是IO密集型的,我們就需要建立比處理器核心數大幾倍數量的執行緒。

執行緒數=CPU可用核心數/(1-阻塞係數),其中阻塞係數取值0和1之間。
計算密集型任務阻塞係數為0,而IO密集型任務的阻塞係數接近1。
廢話,不多說了哈!直接上程式碼:

package zl;

import java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * Semaphore還提供一些其他方法: int availablePermits() :返回此訊號量中當前可用的許可證數。 int getQueueLength():返回正在等待獲取許可證的執行緒數。 boolean hasQueuedThreads() :是否有執行緒正在等待獲取許可證。 void reducePermits(int reduction) :減少reduction個許可證。是個protected方法。 Collection getQueuedThreads() :返回所有等待獲取許可證的執行緒集合。是個protected方法。 tryAcquire()方法嘗試獲取許可證 * @author
ZL * 2017年11月26日 */
public class SemaphoreTest { private static final int THREAD_COUNT = 30;//總共的執行緒數 private static ExecutorService threadPool = Executors.newFixedThreadPool(THREAD_COUNT); private static Semaphore semaphore = new Semaphore(10);//可以併發執行的執行緒數 public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { final int j=i; threadPool.execute(new Runnable() { public void run() { try { semaphore.acquire();//acquire()獲取一個許可證 /** * 要執行的程式碼塊 */ System.out.println(j+"zl"); semaphore.release();//使用完之後呼叫release()歸還許可證 } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }

相關推薦

執行ExecutorService 併發引入訊號Semaphore控制執行

檢視本機處理器的核心數程式碼:Runtime.getRuntime().availableProcessors() 所以,應用程式的最小執行緒數應該等於可用的處理器核數。如果所有的任務都是計算密集型的,則建立處理器可用的核心數那麼多執行緒就可以了。在這種情況下

執行的封裝和使用代理模式工廠模式

通過執行緒池代理類和執行緒池工廠完成對執行緒池操作的解耦。 簡單的代理模式和簡單的工廠模式 1.建立一個代理類 public class ThreadPoolProxy { Threa

Linuxepoll+執行實現高併發

伺服器併發模型通常可分為單執行緒和多執行緒模型,這裡的執行緒通常是指“I/O執行緒”,即負責I/O操作,協調分配任務的“管理執行緒”,而實際的請求和任務通常交由所謂“工作者執行緒”處理。通常多執行緒模型下,每個執行緒既是I/O執行緒又是工作者執行緒。所以這裡討論的是,單I/O執行緒+多工作者執行緒的模型,這也

在spring boot使用java執行ExecutorService

1. 認識java執行緒池 1.1 在什麼情況下使用執行緒池? 1.單個任務處理的時間比較短 2.需處理的任務的數量大 1.2 使用執行緒池的好處: 1.減少在建立和銷燬執行緒上所花的時間以及系統資源的開銷 2.如不使用執行緒池,有可能造成系統建立大量執行緒而導致消耗完系統記

初識Java的四大執行和ThreadPoolExecutor的使用歡迎指正

初識Java中的四大執行緒池和ThreadPoolExecutor的使用(轉載+自身心得) 為什麼用執行緒池? 1.建立/銷燬執行緒伴隨著系統開銷,過於頻繁的建立/銷燬執行緒,會很大程度上影響處-理效率; 2.執行緒併發數量過多,搶佔系統資源從而導致阻塞; 3.對執行緒進行一些簡單的

併發程式設計-concurrent指南-執行ExecutorService的使用

有幾種不同的方式來將任務委託給 ExecutorService 去執行: execute(Runnable) submit(Runnable) submit(Callable) invokeAny(…) invokeAll(…) execute(Runnable) execut

java 執行 ExecutorService shutdonw及其多執行執行完成判斷

1.線上程池 ExecutorService的使用過程中,主執行緒開啟了多個子執行緒,如果判斷所有子執行緒任務是否完成問題; 方法一: BusinessHandler b = new Busines

java執行ExecutorService 執行管理

 程式碼: package com.bob.test; import java.util.concurrent.ExecutorService; import java.util.concurren

Java併發4深入分析java執行框架及實現原理

先說說我個人對執行緒池的理解:執行緒池顧名思義是一個裝有很多執行緒的池子,這個池子維護著從執行緒建立到銷燬的怎個生命週期以及執行緒的分配,使用者只需要把任務提交給這個執行緒池而不用去關心執行緒池如何建立執行緒,執行緒池會自己給這些任務分配執行緒資源來完成任務。 java的E

java 執行 ExecutorService相關歸納

public class ExecutorServiceDemo {     public static void main(String[] args) {          // 單執行緒池  &

關於執行 ExecutorService 的總結

一 、Java通過Executors提供四種執行緒池: newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。 newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超

用程序執行實現高併發伺服器

思想:   1.  建立與伺服器相同cpu個數的程序個數來監聽(accept)客戶端響應,並在每個程序中先建立好一個執行緒池   2.  有客戶端訪問時,解除其中一個程序的accpet阻塞,進入到執行緒中來執行接收資料工作( recv() ),用執行緒防止recv阻塞,執行緒呼叫recv方法   3. 

Java執行ExecutorService

開篇前,我們先來看看不使用執行緒池的情況: new Thread的弊端 執行一個非同步任務你還只是如下new Thread嗎? ?1234567new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated meth

springcloud非同步執行、高併發請求feign解決方案

ScenTaskTestApplication.java package com.test; import org.springframework.boot.SpringApplication; import org.springframework.boot.a

Java執行 ExecutorService

一、ExecutorService介紹 ExecutorService是Java中對執行緒池定義的一個介面,它java.util.concurrent包中,在這個介面中定義了和後臺任務執行相關的方法:  Java API對ExecutorService

深入理解Java執行原理分析與使用尤其當執行佇列滿了之後事項

在這裡借花獻佛了,那別人的東西學一學了。在我們的開發中“池”的概念並不罕見,有資料庫連線池、執行緒池、物件池、常量池等等。下面我們主要針對執行緒池來一步一步揭開執行緒池的面紗。使用執行緒池的好處1、降低資源消耗可以重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。2、提高響應速度當任務到達時,任務可以不需

併發執行安全的單例模式最全最經典

在所有的設計模式中,單例模式是我們在專案開發中最為常見的設計模式之一,而單例模式有很多種實現方式,你是否都瞭解呢?高併發下如何保證單例模式的執行緒安全性呢?如何保證序列化後的單例物件在反序列化後任然是單例的呢?這些問題在看了本文之後都會一一的告訴你答案,趕快來閱讀吧! 什麼

併發環境下執行安全的單例模式最全最經典

在所有的設計模式中,單例模式是我們在專案開發中最為常見的設計模式之一,而單例模式有很多種實現方式,你是否都瞭解呢?高併發下如何保證單例模式的執行緒安全性呢?如何保證序列化後的單例物件在反序列化後任然是單例的呢?這些問題在看了本文之後都會一一的告訴你答案,趕快來閱讀吧!什麼是單

執行處理高併發請求

背景 本系統(支付系統)會在每個月特定時間(如賬單日某個時間)接收上游系統發起的大量請求並進行處理,並在處理完成後返回結果給上游系統。而本系統接收到請求進行處理的過程是呼叫第三方(支付公司)進行處理並獲取結果。 系統原實現方案沒有采用任何控制請求併發數的措施,接

執行ExecutorService的4種拒絕策略

ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。 ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。 ThreadPoolExecutor.Di