日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

测试并发应用(三)监控Executor框架

發布時間:2025/3/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 测试并发应用(三)监控Executor框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本文是《 Java 7 Concurrency Cookbook 》的第八章, 作者: Javier Fernández González 譯者:鄭玉婷

監控Executor框架

Executor 框架提供從線程的創建和管理來分別實現任務來執行這些任務的機制。如果你使用一個執行者,你只需要實現 Runnable 對象并把他們發送給執行者。 執行者的責任是管理線程。當你發一個任務給執行者,它會嘗試使用pooled線程來執行這個任務,來避免創建新的任務。此機制由 Executor 接口提供,它是以 ThreadPoolExecutor 類來實現的。

在這個指南,你將學習從ThreadPoolExecutor執行者可以獲取的信息和如何獲取這些信息。

準備

指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打開并創建一個新的java項目。

怎么做呢…

按照這些步驟來實現下面的例子::


01//1. 創建一個類,名為 Task,并實現 Runnable 接口.
02 public class Task implements Runnable {
03?
04//2. 聲明一個私有 long 屬性,名為 milliseconds.
05 private long milliseconds;
06?
07//3. 實現類的構造函數,初始化它的屬性。
08 public Task (long milliseconds) {
09 this.milliseconds=milliseconds;
10}
11?
12//4. 實現 run() 方法。通過 milliseconds 屬性讓線程進入一段時間休眠。
13@Override
14 public void run() {
15 System.out.printf("%s: Begin\n",Thread.currentThread(). getName());
16 try {
17TimeUnit.MILLISECONDS.sleep(milliseconds);
18 } catch (InterruptedException e) {
19e.printStackTrace();
20}
21 System.out.printf("%s: End\n",Thread.currentThread(). getName());
22}
23?
24//5. 創建例子的主類通過創建一個類,名為 Main 并添加 main()方法。
25 public class Main {
26?
27 public static void main(String[] args) throws Exception {
28?
29//6. 使用Executors類的newCachedThreadPool()方法創建新的 Executor 對象。
30ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors. newCachedThreadPool();
31?
32//7. 創建并提交10個 Task 對象給執行者。用隨機數字初始化任務。
33 Random random=new Random();
34 for (int i=0; i<10; i++) {
35 Task task=new Task(random.nextInt(10000));
36executor.submit(task);
37}
38?
39//8. 創建迭代為5的for循環。在每步,傳遞執行者調用 showLog() 方法寫相關信息,并讓線程休眠1秒。
40 for (int i=0; i<5; i++){
41showLog(executor);
42 TimeUnit.SECONDS.sleep(1);
43}
44?
45//9. 使用 shutdown() 方法關閉執行者。
46executor.shutdown();
47?
48//10. 另創建迭代為5的for循環。在每步,傳遞執行者調用 showLog() 方法寫相關信息,并讓線程休眠1秒。
49 for (int i=0; i<5; i++){
50showLog(executor);
51 TimeUnit.SECONDS.sleep(1);
52}
53?
54//11. 使用 awaitTermination() 方法等待執行者的終結。
55 executor.awaitTermination(1, TimeUnit.DAYS);
56?
57//12. 顯示一條結束程序的信息。
58 System.out.printf("Main: End of the program.\n");
59}
60?
61//13. 實現 showLog() 方法,接收 Executor 作為參數。寫關于pool的大小,任務的數量,和執行者狀態的信息。
62 private static void showLog(ThreadPoolExecutor executor) {
63 System.out.printf("*********************");
64 System.out.printf("Main: Executor Log");
65 System.out.printf("Main: Executor: Core Pool Size:%d\n",executor.getCorePoolSize());
66 System.out.printf("Main: Executor: Pool Size: %d\n",executor. getPoolSize());
67 System.out.printf("Main: Executor: Active Count:%d\n",executor.getActiveCount());
68 System.out.printf("Main: Executor: Task Count: %d\n",executor. getTaskCount());
69 System.out.printf("Main: Executor: Completed Task Count:%d\n",executor.getCompletedTaskCount());
70 System.out.printf("Main: Executor: Shutdown: %s\n",executor. isShutdown());
71 System.out.printf("Main: Executor: Terminating:%s\n",executor.isTerminating());
72 System.out.printf("Main: Executor: Terminated: %s\n",executor. isTerminated());
73 System.out.printf("*********************\n");
74}

它是如何工作的…

在這個指南里,你實現了一個任務,它對它的執行線程進行了一段隨機毫秒數的阻塞。然后,你發送10個任務給執行者,并且當你正在等待它們的終結的同時,你已經把關于執行者的狀態的信息寫入到操控臺。你使用了以下的方法來獲取 Executor 對象的狀態:

  • getCorePoolSize(): 此方法返回一個int數,表示線程的核心數。它是當執行者沒有執行任何任務時,在內部線程池的線程數。
  • getPoolSize(): 此方法返回一個int數,表示內部線程池的真實大小。
  • getActiveCount(): 此方法返回一個int數,表示當前執行任務的線程數。
  • getTaskCount(): 此方法返回一個long數,表示已經分配執行的任務數。
  • getCompletedTaskCount(): 此方法返回一個long數,表示已經被這個執行者執行并結束執行的任務數。
  • isShutdown(): 當 執行的 shutdown() 方法被調用來結束執行時,此方法返回 Boolean 值。
  • isTerminating(): 當執行者正在操作shutdown(),但是還沒結束時,此方法返回 Boolean 值。
  • isTerminated(): 當這個執行者結束執行時,此方法返回 Boolean 值。

總結

以上是生活随笔為你收集整理的测试并发应用(三)监控Executor框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。