1. 程式人生 > >Executors工具類 4種獲取執行緒池服務物件的方法

Executors工具類 4種獲取執行緒池服務物件的方法

java中目前我只瞭解4 種獲得多執行緒的方法 :

1.繼承Thread類 ,重寫run方法

2.new Thread(實現Runnable介面)

3.FutureTask ft = new FutureTask<Integer>(new MyThread());
new Thread(ft).start();             

MyThread自己寫的   實現了Callable<>介面

FutureTask<>本身就實現了Runable介面

4. 通過工具類  Executors 獲得執行緒池 

先說四種常用方法:

ExecutorService service = Executors.newFixedThreadPool(5);// 一池5執行緒
ExecutorService service = Executors.newSingleThreadExecutor();// 一池1執行緒
ExecutorService service = Executors.newCachedThreadPool();//根據當前任務量自動調節池中執行緒數

ScheduledExecutorService service = Executors.newScheduledThreadPool(5);//一池5執行緒

前三個開啟執行緒的方法是 :

Future<T> result = service.submit( 實現 Callable<T> 介面)

然後用得到的 result.get()    獲取 call()方法的返回值.

最後一個有點特殊:

ScheduledFuture<T> result = service.schedule ( 實現 Callable<T> 介面, 秒數, TimeUnit.SECONDS);

  

這個schedule方法有什麼不同呢?

他可以設定從該執行緒池中獲得執行緒的最小間隔時間,比如規定100毫秒內只允許請求使用一個執行緒,其他請求就等著

這樣可以大大的減少伺服器壓力

三個引數:  

 第一個不用講了.    

 第二個 需要整數,獲得執行緒的最小間隔時間.   

第三個引數是TimeUnit列舉型別 設定第二個引數的單位

下面是程式碼:

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;


/**
 * 獲得執行緒池的四種方式
 * @author start_lie
 */
public class Test3
{
	public static void main(String[] args)
	{
		ScheduledExecutorService service = Executors.newScheduledThreadPool(5);//一池5執行緒
		ScheduledFuture<Integer> result = null;
		try 
		{
			for (int i = 1; i <=15; i++) 
			{
				result = service.schedule(() -> {
					System.out.print(Thread.currentThread().getName());
					return new Random().nextInt(30);
				}, 2, TimeUnit.SECONDS);
				System.out.println("*******result: "+result.get());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			service.shutdown();
		}
	}

	private static void testThreadPool()
	{
		//ExecutorService service = Executors.newFixedThreadPool(5);//一池5執行緒
		//ExecutorService service = Executors.newSingleThreadExecutor();//一池1執行緒
		ExecutorService service = Executors.newCachedThreadPool();
		Future<Integer> result = null;
		try 
		{
			for (int i = 1; i <=15; i++) 
			{
				result = service.submit(() -> {
					System.out.print(Thread.currentThread().getName());
					return new Random().nextInt(30);
				});
				System.out.println("*******result: "+result.get());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			service.shutdown();
		}
	}

}