启动线程内部的方法?

时间:2018-01-30 19:32:12

标签: java multithreading

我在杀死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()不存在。

我该怎么办?

2 个答案:

答案 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();