public class Threadsample implements ActionListener {
HelloRunner hr = new HelloRunner();
Thread tr1 = new Thread(hr, "ThreadOne");
public void actionPerformed(ActionEvent ae)
{
Object source = ae.getSource();
if (source == b2){
hr.stopRunning();
}
if (source== b1){
tr1.start();
}
}
public class HelloRunner implements Runnable
{
private volatile boolean timeToQuit=false;
int i = 0;
public void run(){
while ( ! timeToQuit ){
System.Out.Println(i);
i++
}
}
public void stopRunning() {
timeToQuit=true;
}
}
}
如何停止正在运行的线程?
答案 0 :(得分:1)
线程中断是要走的路:
// computingThread computing here
while (!Thread.currentThread.isInterrupted()){
System.Out.Println(i);
i++;
}
//.... in other part of your program, your main thread for instance:
public void stopComptuterThread() {
computingThread.interrupt(); // assuming computingThread reference reachable
}
的确,有些人会使用Thread.stop()
方法.. =>这就是为什么它会非常糟糕:https://www.securecoding.cert.org/confluence/display/java/THI05-J.+Do+not+use+Thread.stop()+to+terminate+threads
答案 1 :(得分:0)
不推荐使用Thread.stop,不应使用它。 示例代码在这里: pause-and-resume-thread
答案 2 :(得分:0)
你的代码会做。您可以使用内置中断方法,该方法大致相同,但如果它休眠/等待,也会使用InterruptedException唤醒线程。很高兴知道Java不允许以“艰难的方式”停止线程(除了在线程上使用.stop()方法,不推荐使用。)
总的来说,过程看起来如下:
用户通过设置一个标志(你的情况)或通过调用.interrupt()方法来请求线程停止,该方法设置标志.interrupted()和“shakes”线程如果它正在睡觉就醒来/等待。
阻止它执行的线程无关紧要。如果你没有实现一些逻辑处理中断标志,那么线程就无法对试图中断它的外部线程作出反应,并且在JVM结束执行后会死掉。
答案 3 :(得分:0)
您确定,这是线程问题吗?您是否检查过.actionPerformed是否实际调用.stopRunning方法?
无论如何,请尝试以下代码示例。它适用于100%。
class HelloRunner implements Runnable {
private volatile boolean timeToQuit = false;
int i = 0;
public void run() {
while (!timeToQuit) {
System.out.println(i);
i++;
}
}
public void stopRunning() {
timeToQuit = true;
}
}
public class MainRunner {
public static void main(String[] args) throws InterruptedException {
HelloRunner hr = new HelloRunner();
Thread tr1 = new Thread(hr, "ThreadOne");
tr1.start();
Thread.sleep(100);
hr.stopRunning();
}
}