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(); } } }