如何编写实现Runnable
接口的类的方法(从ExecutorService
开始)会中断线程?
我知道我可以使用Future fut = es.submit(foo);
(其中es
是ExecutorService
而foo
是我班级的一个实例),然后从fut.cancel(true);
调用public void stop() {…}
在应用程序的主要功能中,但如何从类本身内部调用类似的东西?
我想在我的Runnable类中有一个方法
foo.stop()
这样我就可以从任何地方(包括来自应用程序的主函数)调用Future.cancel
,它就像我使用{{1}}函数一样工作(它必须引发ÌnterruptedException`如果线程正在等待获取信号量)。
答案 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()
?您能否在设计要求中添加一些精度?