Java 線程池 Java 四種線程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExec

 

 

 
_____________________________________________________________________________

ExecutorService——newScheduledThreadPool使用功能測試

https://blog.csdn.net/wo541075754/article/details/51556198css

測試目的

學習ScheduledExecutorService類建立的newScheduledThreadPool相關用法html

具體事例

建立newScheduledThreadPool及scheduleAtFixedRate和scheduleWithFixedDelay方法的使用。java

package com.secbro.test.thread; import java.text.DateFormat; import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * 建立一個大小無限的線程池。此線程池支持定時以及週期性執行任務的需求。 * @author zhuzhisheng * @Description * @date on 2016/6/1. */ public class TestNewScheduledThreadPool { public static void main(String[] args) { ScheduledExecutorService service = Executors.newScheduledThreadPool(2); scheduleAtFixedRate(service,1000); scheduleAtFixedRate(service,6000); scheduleWithFixedDelay(service,1000); scheduleWithFixedDelay(service,6000); } private static void scheduleAtFixedRate(ScheduledExecutorService service, final int sleepTime){ service.scheduleAtFixedRate(new Runnable() { @Override public void run() { long start = new Date().getTime(); System.out.println("scheduleAtFixedRate 開始執行時間:" + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } long end = new Date().getTime(); System.out.println("scheduleAtFixedRate 執行花費時間=" + (end -start)/1000 + "m"); System.out.println("scheduleAtFixedRate 執行完成時間:" + DateFormat.getTimeInstance().format(new Date())); System.out.println("======================================"); } },1000,5000,TimeUnit.MILLISECONDS); } private static void scheduleWithFixedDelay(ScheduledExecutorService service,final int sleepTime){ service.scheduleWithFixedDelay(new Runnable() { @Override public void run() { long start = new Date().getTime(); System.out.println("scheduleWithFixedDelay 開始執行時間:" + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } long end = new Date().getTime(); System.out.println("scheduleWithFixedDelay執行花費時間=" + (end -start)/1000 + "m"); System.out.println("scheduleWithFixedDelay執行完成時間:" + DateFormat.getTimeInstance().format(new Date())); System.out.println("======================================"); } },1000,5000,TimeUnit.MILLISECONDS); } }

具體分析

建立一個ScheduledExecutorService線程池的方法,如下爲建立一個大小爲2的線程池:markdown


   
   
   
   
   
  • 1
ScheduledExecutorService service = Executors.newScheduledThreadPool(2);

scheduleAtFixedRate

實驗一


   
   
   
   
   
  • 1
scheduleAtFixedRate(service,1000);

輸出結果爲:多線程

scheduleAtFixedRate 開始執行時間:15:03:15
scheduleAtFixedRate 執行花費時間=1m
scheduleAtFixedRate 執行完成時間:15:03:16 ====================================== scheduleAtFixedRate 開始執行時間:15:03:20 scheduleAtFixedRate 執行花費時間=1m scheduleAtFixedRate 執行完成時間:15:03:21 ======================================

分析得出:在任務執行時間小於間隔時間的狀況下,程序以起始時間爲準則,每隔指定時間執行一次,不受任務執行時間影響。併發

實驗二


   
   
   
   
   
  • 1
scheduleAtFixedRate(service,6000);

輸出結果爲:框架

scheduleAtFixedRate 開始執行時間:15:06:12
scheduleAtFixedRate 執行花費時間=6m
scheduleAtFixedRate 執行完成時間:15:06:18 ====================================== scheduleAtFixedRate 開始執行時間:15:06:18 scheduleAtFixedRate 執行花費時間=6m scheduleAtFixedRate 執行完成時間:15:06:24 ====================================== scheduleAtFixedRate 開始執行時間:15:06:24 scheduleAtFixedRate 執行花費時間=6m scheduleAtFixedRate 執行完成時間:15:06:30

分析得出:當執行任務時間大於間隔時間,此方法不會從新開啓一個新的任務進行執行,而是等待原有任務執行完成,立刻開啓下一個任務進行執行。此時,執行間隔時間已經被打亂。ide

scheduleWithFixedDelay

實驗一

scheduleWithFixedDelay(service,1000);

輸出結果爲:post

scheduleWithFixedDelay 開始執行時間:15:11:03
scheduleWithFixedDelay執行花費時間=1m
scheduleWithFixedDelay執行完成時間:15:11:04 ====================================== scheduleWithFixedDelay 開始執行時間:15:11:09 scheduleWithFixedDelay執行花費時間=1m scheduleWithFixedDelay執行完成時間:15:11:10 ======================================

分析得出:當執行任務小於延遲時間時,第一個任務執行以後,延遲指定時間,而後開始執行第二個任務。學習

實驗二

scheduleWithFixedDelay(service,6000);

輸出結果爲:

scheduleWithFixedDelay 開始執行時間:15:12:53
scheduleWithFixedDelay執行花費時間=6m
scheduleWithFixedDelay執行完成時間:15:12:59 ====================================== scheduleWithFixedDelay 開始執行時間:15:13:04 scheduleWithFixedDelay執行花費時間=6m scheduleWithFixedDelay執行完成時間:15:13:10 ======================================

得出結論:當執行任務大於延遲時間時,第一個任務執行以後,延遲指定時間,而後開始執行第二個任務。

總之:此方法不管任務執行時間長短,都是當第一個任務執行完成以後,延遲指定時間再開始執行第二個任務

 

 
_____________________________________________________________________________

Java 四種線程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

 

 
_____________________________________________________________________________
java多線程之ForkJoinPool
https://blog.csdn.net/tianshi_kco/article/details/53026192
ForkJoinPool 分支/ 合併框架 工做竊取
https://blog.csdn.net/zxm1306192988/article/details/59701101?utm_source=copy
 
[JAVA學習筆記-53]ForkJoin_invoke_submit_execute區別
https://blog.csdn.net/sinat_36263171/article/details/52837867
 
 
 
_____________________________________________________________________________
相關文章
相關標籤/搜索