【问题标题】:Why does Thread.activeCount() count more threads than my code creates?为什么 Thread.activeCount() 计数的线程数比我的代码创建的线程数多?
【发布时间】:2021-10-23 11:26:09
【问题描述】:

我是 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。为什么?

【问题讨论】:

  • 查看所有线程的名称。 HttpClient 创建了许多自己的线程。
  • 你不是唯一一个创建线程的人! Java 本身和许多框架、库等也创建线程。
  • 嗯,那正常吗?我该怎么办?
  • 为什么你认为有什么事情要做,或者你需要做什么?
  • 我正在更改您问题的标题,以反映正文的实际要求。

标签: java multithreading concurrency


【解决方案1】:

您正在使用 Thread.activeCount(),它返回(估计)调用者线程的 ThreadGroup 中的线程数。

这与查询有多少线程正在使用您的固定大小的线程池不同(您已经知道答案,因为您已经创建了它)。

正如其他人所说,您不是唯一一个创建线程的人,具体来说,您不是唯一一个在(我猜)主线程的 ThreadGroup 中创建线程的人。

您创建的执行程序将创建属于您实际实例化它的线程的 ThreadGroup 的线程,因此您将始终拥有比线程池大小更高的计数。

如果您想查看(出于教育和调试目的)jvm 中所有线程的完整图片以及它们正在做什么(即它们的堆栈跟踪),请尝试使用 jstack(它应该捆绑在您选择的 JDK 中) .

https://docs.oracle.com/en/java/javase/11/tools/jstack.html

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多