如何停止通过实现可运行接口创建的线程?

我通过实现可运行接口创建了类,然后在我的项目的其他类中创建了许多线程(将近10个)。< br/> 如何停止这些线程?

184046 次浏览

不建议中途停止(杀死)线程。实际上不推荐使用 API。

然而,你可以在这里得到更多的细节,包括变通方法: 如何在 Java 中杀死线程?

最简单的的方法是将它转换为 interrupt(),这将导致 Thread.currentThread().isInterrupted()返回 true,并且在线程为 等待的某些情况下也可能抛出 InterruptedException,例如 Thread.sleep()otherThread.join()object.wait()等。

run()方法中,您需要捕获该异常并/或定期检查 Thread.currentThread().isInterrupted()值并执行某些操作(例如,break out)。

注意: 虽然 Thread.interrupted()看起来和 isInterrupted()一样,但它有一个讨厌的副作用: 调用 interrupted() 安全 interrupted标志,而调用 isInterrupted()则不会。

其他非中断方法包括使用运行的 Thread 监视的“ stop”(volatile)标志。

如果您使用 ThreadPoolExecutor,并且使用 提交()方法,它将返回一个 Future。您可以在返回的 Future 上调用 取消()来停止 Runnable任务。

使用 Thread.stop()在中途停止 线程不是一个好的实践。更合适的方法是使线程以编程方式返回。让 Runnable 对象在 run()方法中使用共享变量。无论何时,只要希望线程停止,就可以使用该变量作为标志。

编辑: 示例代码

class MyThread implements Runnable{
    

private volatile Boolean stop = false;
    

public void run(){
        

while(!stop){
            

//some business logic
}
}
public Boolean getStop() {
return stop;
}


public void setStop(Boolean stop) {
this.stop = stop;
}
}


public class TestStop {
    

public static void main(String[] args){
        

MyThread myThread = new MyThread();
Thread th = new Thread(myThread);
th.start();
        

//Some logic goes there to decide whether to
//stop the thread or not.
        

//This will compell the thread to stop
myThread.setStop(true);
}
}

如何停止通过实现可运行接口创建的线程?

有许多方法可以停止一个线程,但是所有这些方法都需要特定的代码。停止线程的一个典型方法是有一个线程经常检查的 volatile boolean shutdown字段:

  // set this to true to stop the thread
volatile boolean shutdown = false;
...
public void run() {
while (!shutdown) {
// continue processing
}
}

您还可以中断导致 sleep()wait()和其他一些方法抛出 InterruptedException的线程。您还应该使用以下内容来测试线程中断标志:

  public void run() {
while (!Thread.currentThread().isInterrupted()) {
// continue processing
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// good practice
Thread.currentThread().interrupt();
return;
}
}
}

请注意,使用 interrupt()中断线程必然会导致 没有立即抛出异常。只有当您使用的方法是可中断的时候,才会抛出 InterruptedException

如果你想在类中添加一个实现 Runnableshutdown()方法,你应该定义你自己的类,比如:

public class MyRunnable implements Runnable {
private volatile boolean shutdown;
public void run() {
while (!shutdown) {
...
}
}
public void shutdown() {
shutdown = true;
}
}

IsInterrupt ()工作得非常好 代码只是暂停计时器

此代码停止并重置线程计时器。 H1是处理程序名称。 此代码将添加到您的按钮单击侦听器中。 W _ h = 分钟 w _ m = 毫秒 i = 计数器

 i=0;
w_h = 0;
w_m = 0;




textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m));
hl.removeCallbacksAndMessages(null);
Thread.currentThread().isInterrupted();




}




});




}`