Thread
1. 使用终止标志位
public class MThread extends Thread {
private volatile AtomicBoolean alive;
public MThread(String name) {
super(name);
alive = new AtomicBoolean(true);
}
public void terminate() {
alive.set(false);
}
@Override
public void run() {
while (alive.get()) {
//do something
}
}
}
2. 使用中断
@Override
public void run() {
try {
while (true) {
//do something
if (isInterrupted()) {
throw new InterruptedException();
}
}
} catch (InterruptedException e) {
}
}
}
HandlerThread
HandlerThread实际上类似上面的第一种方式,是使用标志位的方法来退出循环。
之前分析过looper中有一个for循环不断从消息队列中取出消息,没有消息的情况下通过epoll_wait阻塞。
当调用了quit方法之后,消息队列会返回null,从而退出循环。需要注意的是,这个时候未触发的消息是不会再触发的。
网友评论