我在杀死PhantomJS时遇到了麻烦。
我插入此
Thread initThread;
initThread = new Thread()
{
public void run()
{
WebDriver driver = new PhantomJSDriver();
driverList.add(driver);
}
};
initThreadList.add(initThread);
进入for循环(这个循环运行10次)然后我将新创建的线程插入到一个线程列表中,之后我用ExecutorService同时实例化每个线程。
执行此操作后,我运行另一个ExecutorService(就像第一个,所以使用线程和run方法)使用新的PhantomJS驱动程序,在run方法结束时我想杀死使用过的PJS车手。
现在,使用initThreadList.interrupt()
(在run方法的末尾),不起作用,并使进程保持运行(我可以从任务管理器中看到),并且,因为我正在做的这个项目应该支持100多个线程(每个线程与PhantomJS),这不是一个很好的情况(程序浪费的每10个线程~1gb的ram,并且该ram根本不会被清空)。
我想过使用自定义'运行'这样称为'kill'的方法:
Thread initThread;
initThread = new Thread()
{
public void run()
{
WebDriver driver = new PhantomJSDriver();
driverList.add(driver);
}
public void kill()
{
//handle the killing of the driver here
}
};
但显然,当试图做initThreadList.get(x).kill()
时,eclipse告诉我kill()
不存在。
我该怎么办?
答案 0 :(得分:0)
你想什么时候杀死WebDriver
?根据我的理解,你在线程中启动WebDriver,一段时间后你想要杀死它。如果是这种情况,那么您应该实际使用线程的interrupt()
方法。它不会为你杀死线程,它会设置一个标志,你必须自己杀掉它。
例如,在您初始化WebDriver
并将其添加到驱动程序列表后,将其放在run()
方法的末尾:
while(!Thread.interrupted()) {
try {
Thread.sleep(1000);
} catch(InterrupedException e) {
break;
}
}
driver.quit(); // Or however you kill the driver
此代码重复休眠,检查线程是否被中断,并且在此之前不会通过while循环。然后,它调用quit方法。 (或者你用来杀死WebDriver的任何东西)
这当然是假设线程没有做任何其他事情,因为它需要重复轮询线程中断。
答案 1 :(得分:0)
因为您无法在Thread
对象本身内创建方法,所以您可以创建一个实现Runnable
的新类,其中包含您的kill
方法:
public class DriverThread implements Runnable {
private List<WebDriver> driverList;
public DriverThread(List<WebDriver> driverList) {
this.driverList = driverList;
}
@Override
public void run() {
WebDriver driver = new PhantomJSDriver();
driverList.add(driver);
}
public void kill() {
// Kill your driver here!
}
}
现在,您可以像以前一样创建线程:
DriverThread driverThread = new DriverThread(driverList);
Thread initThread = new Thread(driverThread);
initThreadList.add(initThread);
当您要杀死某个DriverThread
WebDriver
时,您可以使用以下内容:
driverThread.kill();