如何阻止通过实现可运行接口创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(); } }); }`