<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 執行器框架教程和最佳實踐 > 原文: [https://howtodoinjava.com/java/multi-threading/executor-framework-tutorial/](https://howtodoinjava.com/java/multi-threading/executor-framework-tutorial/) 與 JDK 5 一起發布的 [Java 執行器框架](https://docs.oracle.com/javase/tutorial/essential/concurrency/executors.html "Executor framework")(`java.util.concurrent.Executor`)用于運行`Runnable`對象,而無需每次都創建新線程,并且主要是重新使用已經創建的線程。 我們都知道有兩種方法可以在 Java 中創建線程。 如果您想了解有關它們比較的更多信息,請閱讀[**如何在 Java**](//howtodoinjava.com/java/multi-threading/difference-between-implements-runnable-and-extends-thread-in-java/ "Difference between “implements Runnable” and “extends Thread” in java")中創建線程。 在 Java 中創建線程是一個非常昂貴的過程,其中還包括內存開銷。 因此,如果我們可以在創建后重新使用這些線程來運行將來的可運行對象,則是一個好主意。 在此**執行器框架教程**中,我將編寫一些演示程序來演示`Executor`的用法,然后我們將討論在設計下一個多線程應用程序時需要牢記的一些最佳實踐。 ## 1\. Java 執行器框架示例 在演示應用程序中,我們有兩個任務正在運行。 兩者都不會終止,并且都應在應用程序的生命周期內運行。 我將嘗試編寫一個主包裝器類,例如: * 如果有任何任務引發異常,則應用程序將捕獲該異常并重新啟動該任務。 * 如果有任何任務運行完畢,應用程序將注意到并重新啟動任務。 下面是上述所需應用程序的代碼示例。 ```java package com.howtodoinjava.multiThreading.executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class DemoExecutorUsage { private static ExecutorService executor = null; private static volatile Future taskOneResults = null; private static volatile Future taskTwoResults = null; public static void main(String[] args) { executor = Executors.newFixedThreadPool(2); while (true) { try { checkTasks(); Thread.sleep(1000); } catch (Exception e) { System.err.println("Caught exception: " + e.getMessage()); } } } private static void checkTasks() throws Exception { if (taskOneResults == null || taskOneResults.isDone() || taskOneResults.isCancelled()) { taskOneResults = executor.submit(new TestOne()); } if (taskTwoResults == null || taskTwoResults.isDone() || taskTwoResults.isCancelled()) { taskTwoResults = executor.submit(new TestTwo()); } } } class TestOne implements Runnable { public void run() { while (true) { System.out.println("Executing task one"); try { Thread.sleep(1000); } catch (Throwable e) { e.printStackTrace(); } } } } class TestTwo implements Runnable { public void run() { while (true) { System.out.println("Executing task two"); try { Thread.sleep(1000); } catch (Throwable e) { e.printStackTrace(); } } } } ``` 請不要忘記在帖子結尾閱讀最佳實踐。 ## 2\. Java 執行器框架 – `MultiRunnable` 不必每個`Runnable`都在單獨的線程中執行。 有時,我們需要在單個線程中執行多個作業,并且每個作業都是`Runnable`的實例。 要設計此類解決方案,應使用`MultiRunnable`。 這個`MultiRunnable`對象不過是需要執行的可運行對象的集合。 唯一的補充是,該`MultiRunnable`庫本身也是`Runnable`。 以下是需要在單個線程中執行的任務列表。 ```java package com.howtodoinjava.multiThreading.executors; public class TaskOne implements Runnable { @Override public void run() { System.out.println("Executing Task One"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public class TaskTwo implements Runnable { @Override public void run() { System.out.println("Executing Task Two"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } public class TaskThree implements Runnable { @Override public void run() { System.out.println("Executing Task Three"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 讓我們創建上述任務的`MultiRunnable`包裝器。 ```java package com.howtodoinjava.demo.multiThread; import java.util.List; public class MultiRunnable implements Runnable { private final List<Runnable> runnables; public MultiRunnable(List<Runnable> runnables) { this.runnables = runnables; } @Override public void run() { for (Runnable runnable : runnables) { new Thread(runnable).start(); } } } ``` 現在可以在下面的程序中以這種方式執行上面的`multi runnable`: ```java package com.howtodoinjava.demo.multiThread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class MultiTaskExecutor { public static void main(String[] args) { BlockingQueue<Runnable> worksQueue = new ArrayBlockingQueue<Runnable>(10); RejectedExecutionHandler rejectionHandler = new RejectedExecutionHandelerImpl(); ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 10, TimeUnit.SECONDS, worksQueue, rejectionHandler); executor.prestartAllCoreThreads(); List<Runnable> taskGroup = new ArrayList<Runnable>(); taskGroup.add(new TestOne()); taskGroup.add(new TestTwo()); taskGroup.add(new TestThree()); worksQueue.add(new MultiRunnable(taskGroup)); } } class RejectedExecutionHandelerImpl implements RejectedExecutionHandler { @Override public void rejectedExecution(Runnable runnable, ThreadPoolExecutor executor) { System.out.println(runnable.toString() + " : I've been rejected ! "); } } ``` ## 3\. Java 執行器框架最佳實踐 1. 始終針對靜態分析工具(例如 [PMD](http://pmd.sourceforge.net/ "pmd home page") 和 [FindBugs](http://findbugs.sourceforge.net/ "findbugs home page"))運行 Java 代碼,以查找更深層次的問題。 它們對于確定將來可能出現的丑陋情況非常有幫助。 2. 始終與高級人員進行交叉檢查并更好地計劃代碼審查,以在執行過程中檢測并可能在代碼中出現[死鎖或活鎖](https://en.wikipedia.org/wiki/Deadlock "deadlock and livelock")。 在大多數情況下,在應用程序中添加運行狀況監視器以檢查正在運行的任務的狀態是一個很好的選擇。 3. 在多線程程序中,也要養成捕獲錯誤的習慣,而不僅僅是異常。 有時會發生意想不到的事情,除了異常之外,Java 還會向您拋出錯誤。 4. 使用退避開關,因此,如果出現問題并且無法恢復,您就不會急于啟動另一個循環來升級情況。 相反,您需要等到情況恢復正常后再重新開始。 5. 請注意,執行器的全部目的是抽象出執行的細節,因此除非明確說明,否則不能保證順序。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看