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+个线程,在这里睡觉似乎不是最有效的方式。