Java线程池 / Executor / Callable / Future
生活随笔
收集整理的這篇文章主要介紹了
Java线程池 / Executor / Callable / Future
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么需要線程池? 每次都要new一個thread,開銷大,性能差;不能統一管理;功能少(沒有定時執行、中斷等)。 使用線程池的好處是,可重用,可管理。
Executor 4種線程池 // 可緩存線程池,如果緩存中沒有可用的,則移出60秒未使用過的線程 ExecutorService service=?Executors.newCachedThreadPool(); ? // 大小固定的線程池 ExecutorService?service= Executors.newFixedThreadPool(5); // 單線程,是線程量=1的FixedThreadPool,多任務下相當于排隊。 ExecutorService?service= Executors.newSingleThreadPool(); // 支持定時和周期,一般情況下可替代timer ScheduledExecutorService exec = Executors.newScheduledThreadPool(int corePoolSize) Demo ExecutorService pool= Executors.newCachedThredPool(); pool.ececute(new Runable()); // 關閉,不再接受新的任務請求 pool.shutdown(); // 立即關閉,停止接受task, pool.showdownNow(); Future .submit(Runnable) 返回一個Future,主要目的是檢查任務執行的狀況(是否完成,有無異常)。 interface Future<V> { V get() throws ...; V get(long timeout,TimeUnit unit) throws ..; void cancel(boolean mayInterrupt); // 取消任務,如果已經開始,mayInterrupt=true時被中斷 boolean isCancelled(); boolean isDown(); } Future task = pool.submit(new Runnable()); task.isDone(); //? task.get(); // 阻塞當前線程,如果task在執行過程中有異常,則會在這里重新拋出 Callable Runnable沒有返回值,Callable<E>有返回值; submit一個runnable,不能知道運行結果,可以submit一個callable。 // 創建callable class MyCallable implements Callable<Integer> { @Override public Integer call() { return 1; } } Future<Integer> task = pool.submit(new MyCallable()); task.get(); // 阻塞,顯示結果 FutureTask 同時包裝了Future和Task。 Callable<Integer> c = ...; FutureTask<Integer> t = new FutureTask<Integer>(c); new Thread(task).start(); Integer r = t.get(); CompletionService completionService = new ExecutorCompletionService<Long>(exec); for(){ completionService.submit(new Callable()); } // 取完成的任務,如果沒有,就阻塞等待 completionService.take().get()
Executor 4種線程池 // 可緩存線程池,如果緩存中沒有可用的,則移出60秒未使用過的線程 ExecutorService service=?Executors.newCachedThreadPool(); ? // 大小固定的線程池 ExecutorService?service= Executors.newFixedThreadPool(5); // 單線程,是線程量=1的FixedThreadPool,多任務下相當于排隊。 ExecutorService?service= Executors.newSingleThreadPool(); // 支持定時和周期,一般情況下可替代timer ScheduledExecutorService exec = Executors.newScheduledThreadPool(int corePoolSize) Demo ExecutorService pool= Executors.newCachedThredPool(); pool.ececute(new Runable()); // 關閉,不再接受新的任務請求 pool.shutdown(); // 立即關閉,停止接受task, pool.showdownNow(); Future .submit(Runnable) 返回一個Future,主要目的是檢查任務執行的狀況(是否完成,有無異常)。 interface Future<V> { V get() throws ...; V get(long timeout,TimeUnit unit) throws ..; void cancel(boolean mayInterrupt); // 取消任務,如果已經開始,mayInterrupt=true時被中斷 boolean isCancelled(); boolean isDown(); } Future task = pool.submit(new Runnable()); task.isDone(); //? task.get(); // 阻塞當前線程,如果task在執行過程中有異常,則會在這里重新拋出 Callable Runnable沒有返回值,Callable<E>有返回值; submit一個runnable,不能知道運行結果,可以submit一個callable。 // 創建callable class MyCallable implements Callable<Integer> { @Override public Integer call() { return 1; } } Future<Integer> task = pool.submit(new MyCallable()); task.get(); // 阻塞,顯示結果 FutureTask 同時包裝了Future和Task。 Callable<Integer> c = ...; FutureTask<Integer> t = new FutureTask<Integer>(c); new Thread(task).start(); Integer r = t.get(); CompletionService completionService = new ExecutorCompletionService<Long>(exec); for(){ completionService.submit(new Callable()); } // 取完成的任務,如果沒有,就阻塞等待 completionService.take().get()
轉載于:https://www.cnblogs.com/caca/p/java_executors.html
總結
以上是生活随笔為你收集整理的Java线程池 / Executor / Callable / Future的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ural_1030. Titanic
- 下一篇: java美元兑换,(Java实现) 美元