如何正确停止线程
关于如何正确停止线程,这篇文章(how to stop thread)给出了一个很好的答案, 总结起来就下面3点(在停止线程时):
1. 使用violate boolean变量来标识线程是否停止
2. 停止线程时,需要调用停止线程的interrupt()方法,因为线程有可能在wait()或sleep(), 提高停止线程的即时性
3. 对于blocking IO的处理,尽量使用InterruptibleChannel来代替blocking IO
核心如下:
If you are writing your own small thread then you should follow the following example code.
private volatile Thread myThread; public void stopMyThread() { Thread tmpThread = myThread; myThread = null; if (tmpThread != null) { tmpThread.interrupt(); } } public void run() { if (myThread == null) { return; // stopped before started. } try { // all the run() method's code goes here ... // do some work Thread.yield(); // let another thread have some time perhaps to stop this one. if (Thread.currentThread().isInterrupted()) { throw new InterruptedException("Stopped by ifInterruptedStop()"); } // do some more work ... } catch (Throwable t) { // log/handle all errors here } }