Java 启动线程内部的方法?
我很难杀死幽灵 我插入这个Java 启动线程内部的方法?,java,multithreading,Java,Multithreading,我很难杀死幽灵 我插入这个 Thread initThread; initThread = new Thread() { public void run() { WebDriver driver = new PhantomJSDriver(); driverList.add(driver); } }; initThreadList.add(initThread); 在for循环中(这个循环运行10次)
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”的自定义“run”方法,如下所示:
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()
不存在
我能做什么?什么时候你想杀死WebDriver
?据我所知,你在线程中启动WebDriver,一段时间后你想杀死它。如果是这样,那么你应该实际使用中断()
线程的方法。它不会为您终止线程,它会设置一个标志,您必须自己终止它
例如,在初始化WebDriver
并将其添加到driverlist后,将其放在run()
方法的末尾:
while(!Thread.interrupted()) {
try {
Thread.sleep(1000);
} catch(InterrupedException e) {
break;
}
}
driver.quit(); // Or however you kill the driver
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!
}
}
这段代码会反复休眠,检查线程是否被中断,并且在此之前不会通过while循环。然后,它会调用quit方法。(或者执行任何可以杀死WebDriver的操作)
当然,这是假设线程没有做任何其他事情,因为它需要重复轮询线程中断。因为您不能在线程
对象本身内部创建方法,您可以创建一个实现可运行
的新类,其中包含kill
方法:
while(!Thread.interrupted()) {
try {
Thread.sleep(1000);
} catch(InterrupedException e) {
break;
}
}
driver.quit(); // Or however you kill the driver
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!
}
}
当您想杀死某个驱动程序读取的WebDriver
时,可以使用以下方法:
driverThread.kill();
您可以尝试创建一个扩展Thread
的类,并在那里实现kill方法。您的driverList
应该是这些类的列表,并将它们添加到列表中。然后kill方法应该是可访问的。不过,我还没有使用PhantomJS,因此它可能会以不同的方式处理线程。@coolioasjulio将尝试并更新尽快发布。谢谢。这可能是一个解决方案,但它的效率有多高?我可能需要300/400+个线程,在这里睡觉似乎不是最有效的方式。