我想点击按钮时启动/停止线程。
这是我试图做的事情。
Thread thread;
String c = classMain.classes.get(a);
Class c1 = Class.forName(c);
Method ref = c1.getMethod("ref");
Object rex = c1.newInstance();
thread = new Thread(new Runnable() {
public void run() {
try {
running = true;
ref.invoke(rex, null);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
});
if (isRunning() == true) {
System.out.println("Here");
running = false;
thread.interrupt();
thread.join();
} else {
thread.start();
}
出于某种原因,interrupt()
和join()
不会停止该帖子。
我该怎么办?我错过了什么吗?
修改的
好吧,所以我找到了一个快速而又脏的解决方案:抛出一个自定义异常。
我会更好地解释:
而不是thread.interrupt()
和thread.join()
,我启动了一个名为interrupt
的反射方法。
它启动一个异常,使线程崩溃,从而立即终止。
我不确定这是否有效(我不得不说我调用的方法是用Selenium进行的测试,理论上,它不应该像这样关闭时浪费资源),所以如果你知道更多让我知道。
答案 0 :(得分:0)
您可能想要了解join
和interrupt
的内容。
join
只是等待线程完成,interrupt
只是将中断信号发送给线程,这通常什么也不做,它只会在线程等待某个IO或类似的情况下工作。中断信号通常用于关闭一个线程,但完全由线程来检查它并在收到它时正确关闭。你的问题没有详细说明你的第二个帖子中发生了什么,以确定这是否有效。
如果由于某种原因无法更改线程中运行的代码以使其听取interrupt
,则可以使用Thread.stop
。然而,它被弃用,因为使用它可能很危险,因为它容易导致死锁。 Thread的Javadoc链接到了有关该主题的几个优秀资源。
另请注意,start
一个帖子不止一次是非法的,这似乎就像你想要做的那样。您将需要重新创建它。 (与再次呼叫new Thread
和start
一样。)