<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國際加速解決方案。 廣告
                每隔一段時間需要調度任務執行,也許你想注冊一個任務在客戶端完成連接5分鐘后執行,一個常見的用例是發送一個消息“你還活著?”到遠端通,如果遠端沒有反應,則可以關閉通道(連接)和釋放資源。 本節介紹使用強大的 EventLoop 實現任務調度,還會簡單介紹 Java API的任務調度,以方便和 Netty 比較加深理解。 ### [](https://github.com/waylau/essential-netty-in-action/blob/master/ADVANCED%20TOPICS/Scheduling%20tasks%20for%20later%20execution.md#使用普通的-java-api-調度任務)使用普通的 Java API 調度任務 在 Java 中使用 JDK 提供的 ScheduledExecutorService 實現任務調度。使用 Executors 提供的靜態方法創建 ScheduledExecutorService,有如下方法 Table 15.1 java.util.concurrent.Executors-Static methods to create a ScheduledExecutorService | 方法 | 描述 | | --- | --- | | newScheduledThreadPool(int corePoolSize) newScheduledThreadPool(int corePoolSize,ThreadFactorythreadFactory) | | ScheduledThreadExecutorService 用于調度命令來延遲或者周期性的執行。 corePoolSize 用于計算線程的數量 newSingleThreadScheduledExecutor() newSingleThreadScheduledExecutor(ThreadFact orythreadFactory) | 新建一個 ScheduledThreadExecutorService 可以用于調度命令來延遲或者周期性的執行。它將使用一個線程來執行調度的任務 下面的 ScheduledExecutorService 調度任務 60 執行一次 Listing 15.4 Schedule task with a ScheduledExecutorService ~~~ ScheduledExecutorService executor = Executors .newScheduledThreadPool(10); //1 ScheduledFuture<?> future = executor.schedule( new Runnable() { //2 @Override public void run() { System.out.println("Now it is 60 seconds later"); //3 } }, 60, TimeUnit.SECONDS); //4 // do something // executor.shutdown(); //5 ~~~ 1. 新建 ScheduledExecutorService 使用10個線程 2. 新建 runnable 調度執行 3. 稍后運行 4. 調度任務60秒后執行 5. 關閉 ScheduledExecutorService 來釋放任務完成的資源 ### [](https://github.com/waylau/essential-netty-in-action/blob/master/ADVANCED%20TOPICS/Scheduling%20tasks%20for%20later%20execution.md#使用-eventloop-調度任務)使用 EventLoop 調度任務 使用 ScheduledExecutorService 工作的很好,但是有局限性,比如在一個額外的線程中執行任務。如果需要執行很多任務,資源使用就會很嚴重;對于像 Netty 這樣的高性能的網絡框架來說,嚴重的資源使用是不能接受的。Netty 對這個問題提供了很好的方法。 Netty 允許使用 EventLoop 調度任務分配到通道,如下面代碼: Listing 15.5 Schedule task with EventLoop ~~~ Channel ch = null; // Get reference to channel ScheduledFuture<?> future = ch.eventLoop().schedule( new Runnable() { @Override public void run() { System.out.println("Now its 60 seconds later"); } }, 60, TimeUnit.SECONDS); ~~~ 1. 新建 runnable 用于執行調度 2. 稍后執行 3. 調度任務60秒后運行 如果想任務每隔多少秒執行一次,看下面代碼: Listing 15.6 Schedule a fixed task with the EventLoop ~~~ Channel ch = null; // Get reference to channel ScheduledFuture<?> future = ch.eventLoop().scheduleAtFixedRate( new Runnable() { @Override public void run() { System.out.println("Run every 60 seconds"); } }, 60, 60, TimeUnit.SECONDS); ~~~ 1. 新建 runnable 用于執行調度 2. 將運行直到 ScheduledFuture 被取消 3. 調度任務60秒運行 取消操作,可以使用 ScheduledFuture 返回每個異步操作。 ScheduledFuture 提供一個方法用于取消一個調度了的任務或者檢查它的狀態。一個簡單的取消操作如下: ~~~ ScheduledFuture<?> future = ch.eventLoop() .scheduleAtFixedRate(..); //1 // Some other code that runs... future.cancel(false); //2 ~~~ 1. 調度任務并獲取返回的 ScheduledFuture 2. 取消任務,阻止它再次運行 ### [](https://github.com/waylau/essential-netty-in-action/blob/master/ADVANCED%20TOPICS/Scheduling%20tasks%20for%20later%20execution.md#調度的內部實現)調度的內部實現 Netty 內部實現其實是基于George Varghese 提出的 “Hashed and hierarchical timing wheels: Data structures to efficiently implement timer facility(散列和分層定時輪:數據結構有效實現定時器)”。這種實現只保證一個近似執行,也就是說任務的執行可能不是100%準確;在實踐中,這已經被證明是一個可容忍的限制,不影響多數應用程序。所以,定時執行任務不可能100%準確的按時執行。 為了更好的理解它是如何工作,我們可以這樣認為: * 在指定的延遲時間后調度任務; * 任務被插入到 EventLoop 的 Schedule-Task-Queue(調度任務隊列); * 如果任務需要馬上執行,EventLoop 檢查每個運行; * 如果有一個任務要執行,EventLoop 將立刻執行它,并從隊列中刪除; * EventLoop 等待下一次運行,從第4步開始一遍又一遍的重復。 因為這樣的實現計劃執行不可能100%正確,對于多數用例不可能100%準備的執行計劃任務;在 Netty 中,這樣的工作幾乎沒有資源開銷。 但是如果需要更準確的執行呢?很容易,你需要使用ScheduledExecutorService 的另一個實現,這不是 Netty 的內容。記住,如果不遵循 Netty 的線程模型協議,你將需要自己同步并發訪問。
                  <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>

                              哎呀哎呀视频在线观看