1.常见停止方式
- 自定义线程,其中含退出标志位,在run中判断它。
- 使用interrupt()方法中断线程
- 使用stop方法暴力终止(已经弃用)
2.使用标志位
class TestThread extends Thread{ volatile boolean flag = true; @Override public void run() { while (!flag){ Log.d(TAG, "running ...."); } Log.d(TAG, "thread " + getId() + " finished !"); Log.d(TAG, "isAlive " + isAlive()); } public void stopThread(){ flag = false; } } TestThread testThread; void stopThread(){ Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive()); Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted()); testThread.stopThread(); Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive()); Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted()); }
- 调用testThread.stopThread就可以了。
- 使用场景无限制
3.使用interrupt()方法
3.1示例
class TestThread extends Thread{ @Override public void run() { while (!Thread.currentThread().isInterrupted()){ Log.d(TAG, "running .... interrupt = " + this.isInterrupted()); try { Thread. * ); } catch (InterruptedException e) { e.printStackTrace(); Log.d(TAG, "InterruptedException interrupt is reset = " + this.isInterrupted()); // Thread.sleep()方法由于中断抛出异常。 // Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException, // 因为在发生InterruptedException异常的时候,会清除中断标记 // 如果不加处理,那么下一次循环开始的时候,就无法捕获这个异常。 // 故在异常处理中,再次设置中断标记位 Thread.currentThread().interrupt(); } } Log.d(TAG, "thread " + getId() + " finished !"); Log.d(TAG, "isAlive " + isAlive()); } } TestThread testThread; void stopThread(){ Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive()); Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted()); testThread.interrupt(); Log.d(TAG, "stopThread: isAlive : " + testThread.isAlive()); Log.d(TAG, "stopThread: isInterrupted : " + testThread.isInterrupted()); }
3.1使用场景
适合线程处于阻塞状态,如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时。
当调用阻塞线程的interrupt()方法时,会抛出InterruptException异常。通过代码捕获该异常,然后跳出循环状态,从而让我们有机会结束这个线程的执行。
调用interrupt方法后线程并不一定会结束, 只有捕获InterruptedException异常之后跳出循环,才能正常结束run方法。
4.Thread.stop()
已经弃用
http://www.cnblogs.com/sjjg/p/7625571.html