为什么 Thread.activeCount() 计数的线程数比我的代码创建的线程数多?
Why does Thread.activeCount() count more threads than my code creates?
我是 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://whosebug.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.com/","https://youtube.com/",
"https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.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()
函数returns 81。为什么?
您正在使用 Thread.activeCount(),其中 returns(估计)调用者线程的线程组中的线程数。
这与查询有多少线程正在使用您的固定大小线程池不同(您已经知道答案,因为您已经创建了它)。
正如其他人所说,您不是唯一创建线程的人,具体来说,您不是唯一在(我猜)主线程的线程组中创建线程的人。
您创建的执行程序将创建属于您实际实例化它的线程的 ThreadGroup 的线程,因此您的计数将始终高于您的线程池大小。
如果您想查看(出于教育和调试目的)您的 jvm 中所有线程的完整图片以及它们在做什么(即它们的堆栈跟踪),请尝试使用 jstack(它应该捆绑在您的 JDK 的选择)。
我是 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://whosebug.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.com/","https://youtube.com/",
"https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.com/","https://youtube.com/","https://google.com/","https://microsoft.com/","https://yahoo.com/","https://whosebug.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()
函数returns 81。为什么?
您正在使用 Thread.activeCount(),其中 returns(估计)调用者线程的线程组中的线程数。
这与查询有多少线程正在使用您的固定大小线程池不同(您已经知道答案,因为您已经创建了它)。
正如其他人所说,您不是唯一创建线程的人,具体来说,您不是唯一在(我猜)主线程的线程组中创建线程的人。
您创建的执行程序将创建属于您实际实例化它的线程的 ThreadGroup 的线程,因此您的计数将始终高于您的线程池大小。
如果您想查看(出于教育和调试目的)您的 jvm 中所有线程的完整图片以及它们在做什么(即它们的堆栈跟踪),请尝试使用 jstack(它应该捆绑在您的 JDK 的选择)。