Java review--執行緒池

ZeroWM發表於2016-10-22


為什麼要使用執行緒池?

  主要是因為執行緒在建立和銷燬的時候開銷比較大,建立執行緒池,可以讓執行緒併發執行。如果執行緒的建立和銷燬時間,跟執行緒之間切換時間差不多,也沒有用執行緒池的必要。


執行緒池是什麼?

  執行緒池是一種多執行緒處理機制,處理過程將任務新增到佇列裡面,然後建立執行緒後自動啟動這些任務。


執行緒池由組成呢?

  執行緒池管理器(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);
			
		}
	}
}

結果圖:




相關文章