1使用退出标志终止线程
public class ThreadSafe extends Thread {
public volatile boolean exit = false;
public void run() {
while (!exit){
//do something
}
}
}
2使用interrupt()方法终止线程(也可利用InterruptedException逃离阻塞状态)
用法:
class MyThread extends Thread {
public void run() {
try { //阻塞过程捕获中断异常来退出
while(!Thread.currentThread().isInterrupted()) { //非阻塞过程中通过判断中断标志来退出
//当达到队列容量时,在这里会阻塞
//put的内部会调用LockSupport.park()这个是用来阻塞线程的方法
//当其他线程,调用此线程的interrupt()方法时,会设置一个中断标志
//LockSupport.part()中检测到这个中断标志,会抛出InterruptedException,并清除线程的中断标志
//因此在异常段调用Thread.currentThread().isInterrupted()返回为false
ArrayBlockingQueue.put(somevalue);
}
} catch (InterruptedException e) {
//由于阻塞库函数,如:Object.wait,Thread.sleep除了抛出异常外,还会清除线程中断状态,因此可能在这里要保留线程的中断状态
Thread.currentThread().interrupt();
}
}
public void cancel() {
interrupt();
}
}
外部调用
MyThread thread = new MyThread();
thread.start();
......
thread.cancel();
thread.isInterrupted();