3

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

我知道我可以使用Future fut = es.submit(foo);(并且es是我的类的一个实例)然后从应用程序的主函数内部调用,但是我如何从类本身内部调用类似的东西呢?ExecutorServicefoofut.cancel(true);

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

public void stop() {…}

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

4

3 回答 3

3
            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();
                }
            }

但正如人们所说,这是一个糟糕的架构,因为您将正在完成的工作(可运行)与如何完成(执行)的责任混合在一起

于 2013-12-19T17:11:35.947 回答
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;
    }
}
于 2013-09-15T15:19:28.407 回答
1

你想要做的——stop()在 a 中实现一个方法Runnable——实际上可能会给你的代码结构带来一些混乱。为什么?根据Runnable设计,对象是保存必须运行的代码的东西。但是添加stop()方法将超出Runnable对象的唯一责任:也就是说,您将使其能够控制代码的执行。应该避免这种情况。

这里有一个提示:start()Runnable. 事实上,在Thread类中有一个Runnable接口,JDK 中已经引入了接口,以减少“可运行”代码与控制其执行的对象(的实例Thread)之间的耦合。

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

于 2013-09-16T13:04:20.900 回答