Java review--執行緒池
為什麼要使用執行緒池?
主要是因為執行緒在建立和銷燬的時候開銷比較大,建立執行緒池,可以讓執行緒併發執行。如果執行緒的建立和銷燬時間,跟執行緒之間切換時間差不多,也沒有用執行緒池的必要。
執行緒池是什麼?
執行緒池是一種多執行緒處理機制,處理過程將任務新增到佇列裡面,然後建立執行緒後自動啟動這些任務。
執行緒池由組成呢?
執行緒池管理器(ThreadPoolManager):建立並管理執行緒池。
工作執行緒(WorkThread):執行緒池中執行緒。
任務介面(Task):每個任務必須實現的介面,已提供工作執行緒任務排程的執行。
任務佇列:用於存放沒有處理的任務,提供一種緩衝機制。
執行緒池分類?
jdk執行緒池主要分成四種,
newCachedThreadPool:可快取執行緒池,自行建立和回收執行緒。
newFixedThreadPool:建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
newScheduledThreadPool:建立一個定長執行緒池,支援定時及週期性任務執行。
newSingleThreadExecutor:建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO,
LIFO, 優先順序)執行。
專案經驗
在公司裡面,經常用ScheduledThreadPool來做跑批的功能,比如對賬、自動投標等功能,當然也可以使用Quartz框架。
下面寫一個ScheduledThreadPool的demo,簡單介紹一下ScheduledThreadPool的使用。
package com.xm.hashmap;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledTest {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ScheduledExecutorService schedule=Executors.newScheduledThreadPool(2);
/**
* 延遲1s執行一次任務
*/
schedule.schedule(new Runnable() {
@Override
public void run() {
System.out.println("hello world runnable");
}
}, 1000, TimeUnit.MILLISECONDS);
/**
* 延遲2s執行一次任務
*/
Future result =schedule.schedule(new Callable<String>() {
@Override
public String call() throws Exception {
return "hello world callable";
}
}, 100, TimeUnit.MILLISECONDS);
System.out.println(result.get());
/**
* 延遲,2s鍾執行一次
*/
schedule.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("週期任務執行");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
/**
* 延遲
*/
schedule.scheduleWithFixedDelay(new Runnable(){
@Override
public void run() {
System.out.println("定時任務執行 ");
}
}, 1000, 3000, TimeUnit.MILLISECONDS);
//關閉定時和週期任務的執行
Thread.sleep(1000*10);
schedule.shutdown();//平緩的關閉
System.out.println("pool shutdown:"+schedule.isShutdown());
while (!schedule.isTerminated()) {
schedule.awaitTermination(1, TimeUnit.SECONDS);
}
}
}
結果圖:
相關文章
- Java review--多執行緒JavaView執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- 搞懂Java執行緒池Java執行緒
- Java Executors(執行緒池)Java執行緒
- Java執行緒池(Executor)Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- Java 執行緒池執行原理分析Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Android執行緒篇(二)Java執行緒池Android執行緒Java
- 速讀Java執行緒池Java執行緒
- java執行緒池實踐Java執行緒
- Java 執行緒池詳解Java執行緒
- java-執行緒池(一)Java執行緒
- Java執行緒池歸納Java執行緒
- JAVA執行緒池的使用Java執行緒
- Java執行緒池進階Java執行緒
- Java(Android)執行緒池JavaAndroid執行緒
- Java 執行緒池學習Java執行緒
- Java執行緒池詳解Java執行緒
- Java利用執行緒工廠監控執行緒池Java執行緒
- java多執行緒:執行緒池原理、阻塞佇列Java執行緒佇列
- 深入淺出Java多執行緒(十二):執行緒池Java執行緒
- 《Java 高階篇》七:執行緒和執行緒池Java執行緒
- SpringBoot執行緒池和Java執行緒池的實現原理Spring Boot執行緒Java
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒