我遇到了如下问题:我有下一堂课:
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来中断线程?它甚至可能吗?
答案 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()方法。