使用类的方法中断Runnable

时间:2013-09-15 15:04:11

标签: java multithreading java.util.concurrent

如何编写实现Runnable接口的类的方法(从ExecutorService开始)会中断线程?

我知道我可以使用Future fut = es.submit(foo);(其中esExecutorServicefoo是我班级的一个实例),然后从fut.cancel(true);调用public void stop() {…} 在应用程序的主要功能中,但如何从类本身内部调用类似的东西?

我想在我的Runnable类中有一个方法

foo.stop()

这样我就可以从任何地方(包括来自应用程序的主函数)调用Future.cancel,它就像我使用{{1}}函数一样工作(它必须引发ÌnterruptedException`如果线程正在等待获取信号量)。

3 个答案:

答案 0 :(得分:2)

您可以创建自己的类实现Runnable以及另一个接口:

public interface StoppableRunnable extends Runnable {
    public void stop();
}

并使用此类Runnable保证有stop()方法可以调用。

使用示例:

public MyRunnable implements StoppableRunnable {

    private volatile boolean stopped = false;

    public void run() {
       while(!stopped) { // Do something.... }
    }

    public void stop() {
        stopped = true;
    }
}

答案 1 :(得分:2)

            public class MyRunnable implements Runnable {

                private Thread currentThread;

                @Override
                public void run() {
                    currentThread = Thread.currentThread();
                    // Do here something interruptible
                }

                public void interrupt() {
                    if (currentThread != null)
                        currentThread.interrupt();
                }
            }

但正如人们所说的那样,这是糟糕的架构,因为你正在混合什么(Runnable)的责任与它如何完成(执行)

答案 2 :(得分:1)

您想要做什么 - 在stop()中实施Runnable方法 - 实际上可能会在您的代码结构中引入一些混淆。为什么?根据设计,Runnable对象是保存必须运行的代码的东西。但是添加stop()方法将超出Runnable对象的全部责任:也就是说,您将能够控制代码的执行。应该避免这种情况。

以下是提示:start()中没有Runnable方法。实际上,Thread类中有一个,并且JDK中引入了Runnable接口,以减少“可运行”代码与控制之间的对象之间的耦合执行(Thread的实例)。

我的问题是:为什么你不满意future.cancel()?您能否在设计要求中添加一些精度?