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

我通过实现runnable接口创build了类,然后在我的项目的其他类中创build了许multithreading(接近10)。
如何阻止这些线程?

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

run()方法内部,你需要捕获exception和/或定期检查Thread.currentThread().isInterrupted()值并做一些事情(例如,分解)。

注意:尽pipeThread.interrupted()看起来和isInterrupted()是一样的,但它有一个令人讨厌的副作用:调用interrupted() 清除 interrupted标志,而调用isInterrupted()不会。

其他非中断方法包括使用正在运行的线程监视的“停止”( volatile )标志。

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

有很多方法可以阻止线程,但是所有这些方法都需要特定的代码才能完成。 停止线程的一个典型方法是有一个volatile boolean shutdown字段,线程每隔一段时间检查一次:

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

你也可以在你可以testing的线程上设置中断标志,以及导致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()中断一个线程不一定会导致立即抛出exception。 只有当你在一个可中断的方法中, InterruptedException才会被抛出。

如果你想添加一个shutdown()方法到你实现Runnable的类,你应该定义你自己的类,如下所示:

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

如果你使用ThreadPoolExecutor ,并使用submit()方法,它会给你一个Future 。 你可以在返回的Future上调用cancel()来停止你的Runnable任务。

中途停止线不是一个好习惯。 更合适的方法是使线程以编程方式返回。 让Runnable对象在run()方法中使用共享variables。 每当你想让线程停止时,使用该variables作为标志。

编辑:示例代码

 class MyThread implements Runnable{ private 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); } } 

不推荐在中途停止(杀死)线程。 API实际上已被弃用。

但是,您可以在这里获得更多的细节,包括解决方法: 如何杀死Java中的线程?

Thread.currentThread()。isInterrupted()是非常好的工作。 但是这个代码只是暂停计时器。

此代码停止并重置线程计时器。 h1是处理程序名称。 此代码添加到您的button点击侦听器中。 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(); } }); }`