【发布时间】:2019-01-02 10:23:44
【问题描述】:
据我了解,ExecutorService 创建了一个可以重用的线程池。我创建了一个大小为 128 的池,并让它执行 128 个可运行任务。虽然它启动了 128 个线程(通过打印“started”),但只有 10 个线程打印了“finished”。 为什么会出现这种情况?即使其他线程仍然存在,完成的线程是否被重用?还是我的线程根本没有完成?
编辑: 添加了我的代码,但我无法重现结果。我确实发现,但是当我对保存网站进行太多访问时会遇到 socketTimeoutException。
下面是我的代码示例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
public class Test {
static class TestConnection extends Thread{
@Override
public void run() {
System.out.println("Started "+this.getName());
WebDriver driver = new HtmlUnitDriver(true);
driver.get("http://google.com");
//System.out.println(driver.getCurrentUrl());
driver.findElement(By.tagName("html"));
System.out.println("Finished "+this.getName());
}
}
public static void main(String args[]) {
ExecutorService pool = Executors.newFixedThreadPool(128);
for(int i=0; i < 32;i++){
TestConnection task = new TestConnection();
pool.execute(task);
}
pool.shutdown();
try {
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【问题讨论】:
-
记录一下:为什么您的 RunTask 类究竟要扩展 Thread,而不是简单地实现 Runnable?
-
除此之外,我们可能还需要一个真正的minimal reproducible example。您所描述的没有意义-当服务启动任务并且它们确实打印“开始”时,迟早,它们都应该打印“完成”……无论如何。所以,为了帮助你,你应该让我们以某种方式重现这个问题。
-
另外,代码有问题:while(i=0;i
-
我对多线程没有太多经验,所以我扩展了 Thread,因为它是教程的一部分。在原始代码中,我正在创建与 LAN 上不同设备(给定 ip_addresses)的 WebDriver 连接,每个设备都有相同的网页并与这些元素交互。我会看看我是否可以创建一个复制品并尽快更新
标签: java multithreading selenium-webdriver executorservice