我是 Java 開發的初學者,我嘗試在下面的代碼中使用 CountDownLatch 撰寫一個多執行緒程序。但是 ExecutorService 無法正常作業。
ExecutorService 執行緒號無法按照代碼中的定義作業。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class HTTPrequester {
private ExecutorService exs;
private CountDownLatch latch;
private int thread_num = 50;
private String[] url_list;
public static void main(String[] args) {
HTTPrequester req = new HTTPrequester();
req.action();
}
public void action() {
url_list = new String[]{"https://google.com/","https://microsoft.com/","https://yahoo.com/","https://stackoverflow.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://stackoverflow.com/","https://youtube.com/",
"https://google.com/","https://microsoft.com/","https://yahoo.com/","https://stackoverflow.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://stackoverflow.com/","https://youtube.com/"};
exs = Executors.newFixedThreadPool(thread_num);
latch = new CountDownLatch(url_list.length);
for(String url: url_list) {
exs.submit(new Runner(latch,url));
}
}
public class Runner implements Runnable {
private CountDownLatch latch;
private String url;
public Runner(CountDownLatch latch, String url) {
this.latch = latch;
this.url = url;
}
@Override
public void run() {
try {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println("Thread Count: " Thread.activeCount() " - Latch Count: " latch.getCount());
}catch(Exception e) {}
latch.countDown();
}
}
}
控制臺日志;
Thread Count: 81 - Latch Count: 20
Thread Count: 81 - Latch Count: 20
Thread Count: 81 - Latch Count: 20
Thread Count: 81 - Latch Count: 17
Thread Count: 81 - Latch Count: 16
Thread Count: 81 - Latch Count: 15
Thread Count: 81 - Latch Count: 14
Thread Count: 81 - Latch Count: 13
Thread Count: 81 - Latch Count: 12
Thread Count: 81 - Latch Count: 11
Thread Count: 81 - Latch Count: 10
Thread Count: 81 - Latch Count: 9
Thread Count: 81 - Latch Count: 8
Thread Count: 81 - Latch Count: 7
Thread Count: 81 - Latch Count: 6
Thread Count: 81 - Latch Count: 5
Thread Count: 81 - Latch Count: 4
Thread Count: 81 - Latch Count: 3
Thread Count: 81 - Latch Count: 2
Thread Count: 81 - Latch Count: 1
我將執行緒編號定義為 50,但是當它作業時Thread.activeCount()函式回傳 81。為什么?
uj5u.com熱心網友回復:
您正在使用 Thread.activeCount() 回傳(估計)呼叫者執行緒的 ThreadGroup 中的執行緒數。
這與查詢有多少執行緒在使用固定大小的執行緒池不同(您已經知道答案了,因為您已經創建了它)。
正如其他人所說,您不是唯一一個創建執行緒的人,具體來說,您不是唯一一個在主執行緒的 ThreadGroup 中創建執行緒的人(我猜)。
您創建的執行程式將創建登錄到您實際實體化它的執行緒的 ThreadGroup 的執行緒,因此您的計數始終高于執行緒池大小。
如果您想(出于教育和除錯目的)查看 jvm 中所有執行緒的完整圖片以及它們在做什么(即它們的堆疊跟蹤),請嘗試使用 jstack(它應該捆綁在您選擇的 JDK 中)。
https://docs.oracle.com/en/java/javase/11/tools/jstack.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335989.html
