场景:在应用程序中我们需要自己定义一个特殊的线程来调试,以区分其他的线程。比如说:为线程指定名字,设置自定义的UncaugthExceptionHandler向Logger中写入信息,维护一些统计信息(包括有多少线程被创建和销毁),以及在线程被创建和终止时把调试消息写入日志。
代码如下:
public class MyAppThread extends Thread{
public static final String DEFAULT_NAME="MyAppThread";
private static volatile boolean debugLifecycle = false;
private static final AtomicInteger created = new AtomicInteger();
private static final AtomicInteger alive = new AtomicInteger();
private static final Logger log = Logger.getAnonymousLogger();
public MyAppThread(Runnable r) {
// TODO Auto-generated constructor stub
this(r,DEFAULT_NAME);
}
public MyAppThread(Runnable runnable,String name) {
super(runnable, name+"-"+created.incrementAndGet());
//设置为未捕获异常处理
setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
log.log(Level.SEVERE, "Uncaugth in thread"+t.getName(),e);
}
});
}
@Override
public void run() {
boolean debug = debugLifecycle;
if (debug) {
log.log(Level.FINE, "created"+getName());
}
try {
alive.incrementAndGet();
super.run();
}finally {
alive.decrementAndGet();
if (debug) {
log.log(Level.FINE, "exit"+getName());
}
}
}
public static int getThreadsCreated() {
return created.get();
}
public static int getThreadAlive() {
return alive.get();
}
public static boolean getDebug() {
return debugLifecycle;
}
public static void setDebug(boolean b) {
debugLifecycle = b;
}
}