您好,登錄后才能下訂單哦!
Java CountDownLatch完成異步回調實例詳解
實例代碼:
public class AsyncDemo { private static void doSomeTask() { System.out.println("Hello World"); } private static void onCompletion() { System.out.println("All tasks finished"); } public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); final CountDownLatch latch = new CountDownLatch(2); executor.execute(new Task(latch)); executor.execute(new Task(latch)); executor.execute(() -> { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } onCompletion(); }); executor.shutdown(); } private static class Task implements Runnable { /** * CountDownLatch 是JDK提供的一個簡單的線程監測工具 * 基于簡單的計數,調用countDown()方法表明當前線程已經終止 * 在監測線程中調用await()方法,該方法會一直掛起直到所有其它線程終止 */ private final CountDownLatch latch; public Task(CountDownLatch latch) { this.latch = latch; } @Override public void run() { try { doSomeTask(); } catch (Exception e) { e.printStackTrace(); } finally { latch.countDown(); } } } }
這里有兩點需要補充:
1.如果你是用main方法啟動的線程,這種調用方法是沒有問題的,JDK會確保所有線程都終止以后main方法才退出。但是如果main方法不是異步任務的啟動者(如JUnit,Spring,Tomcat),一旦啟動之后laucher將會失去對線程的控制。如在JUnit中laucher提交完任務后就會被認為所有過程已完成,其它線程會被強行終止。
2.正因為如此,請根據環境使用正確的Executor。比如,在web環境中,應該選用tomcat(或Spring)管理的線程池作為Executor,這樣才能確保web應用對于異步任務的整個生命周期具有控制權;如果你選用JDK的線程池有什么后果呢?任務也許可以正常執行,當一旦你終止web-app,正在執行的異步線程并不會被正常kill掉,并由此造成內存泄漏或其它不可預見的后果。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。