一个常见的问题,但我没有找到任何可接受的答案.
我最近遇到了一个问题,即如何以一种很好的方式杀死线程.
我尝试制作一个接受可运行对象的通用消息处理程序.
问题是我无法以良好的方式和足够快的速度退出当前可运行对象.
可运行对象中的代码是未知的,即jni,纯java,3:rd part lib等.
下面是一个带有睡眠的简单示例,它“控制”中断,使线程永不退出(足够快):
我将无法随时中断线程,仅在每个任务之间是不可接受的.
我的第一个想法是使用thread.stop,但已弃用.
制片人:
int i = 0;
MessageHandler handler = new MessageHandler();
handler.start();
handler.post(new Runnable() {
@Override
public void run() {
System.out.println("task -" + i++ + " " + Thread.currentThread().getName());
for (int r=0;r<1000000000;r++) {
System.out.println("task -" + i++ + " " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
try {
Thread.sleep(500);
} catch (InterruptedException q) {
q.printStackTrace();
}
handler.interrupt();
使用者(MessageHandler):
package test;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class MessageHandler extends Thread implements Runnable {
private BlockingQueue msgQue = new LinkedBlockingQueue();
private final static String TAG = "MessageHandler";
public void run() {
try {
System.out.println(TAG + " Initialized " + currentThread().getName());
while(true) {
Runnable task = msgQue.take();
task.run();
if (isInterrupted()) {
break;
}
}
} catch (InterruptedException e) {
System.out.println(TAG + " InterruptedException " + currentThread().getName());
} finally {
System.out.println(TAG + " Exit " + currentThread().getName());
msgQue.clear();
msgQue = null;
}
}
public void post(Runnable task) {
System.out.println(TAG + " post " + currentThread().getName());
msgQue.add(task);
}
}
我觉得自己像个超人,没有任何超能力.
嘿,甲骨文将我的力量还给我!