使用反射唤醒睡眠线程

时间:2015-03-24 12:24:05

标签: java multithreading

我遇到了如下问题:我有下一堂课:

Public class foo{
   Thread runningThread = null;
   ...
   public static void start() {
       runningThread = new RunningThreadImpl();
       runningThread.start();
       runningThread.join();
   }
   public static void stop() {
       this.runningThread.stop();
   }
 }

Public class runningThreadImpl implements Runnable {
...
public void run() {
     while (shouldRun()){
         sleep(... A long long time);
     }
}
public void stop() {
    shouldRun = false;
}

我有一个使用foo的课程,现在我希望它停止。上面的代码在给定的jar中定义,这意味着我无法编辑它。但我想使用Reflection来打断线程并“唤醒”他,所以我不必等待。

到目前为止,我已经走到了这一步:

 Field field = foo.getInstance().getClass().getDeclaredField("runningThread");
 field.setAccessible(true);

但我现在不知道该怎么办。如何使用Field来中断线程?它甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在与Foo相同的包中创建一个名为FooHelper的新类,如下所示:

package same.package.as.foo;

public class FooHelper {
    private final Foo foo;
    public FooHelper(Foo foo) {
        this.foo = foo;
    }

    public void stop() {
        this.foo.stop();
        this.foo.runningThread.interrupt();
    }
}

构造一个FooHelper,将它传递给Foo的实例,并调用FooHelper的stop()方法。