Swing : 将 System.out 重定向到 JTextArea 和 JTextPane (2)
November 5th, 2011
No comments
以前写过一篇文章,《Swing : 将 System.out 重定向到 JTextArea 和 JTextPane》,只提及了如何通过重写来进行流的重定向,没有提供一个良好的接口来直接使用,今天看到:
所以利用睡前的一点时间,重新封装了一下之前的代码,原理不变,代码如下:
以前写过一篇文章,《Swing : 将 System.out 重定向到 JTextArea 和 JTextPane》,只提及了如何通过重写来进行流的重定向,没有提供一个良好的接口来直接使用,今天看到:
所以利用睡前的一点时间,重新封装了一下之前的代码,原理不变,代码如下:
由于线程的本质特性,不能捕获从线程中抛出的异常,一但异常跳出run方法,就会直接输出到控制台。在Java5中,可以用Executor来解决这个问题。
Thread.UncaughtExceptionHandler接口允许在每个Thread对象上附着一个异常处理器,它的uncaughtException方法会在线程因未捕获的异常而临近死亡时被调用。我们可以创建一个ThreadFactory,它将在每个新创建的Thread对象上附着Thread.UncaughtExceptionHanlder。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
class ExceptionThread2 implements Runnable{
public void run() {
Thread t = Thread.currentThread();
System.out.println("run() by "+t);
System.out.println("eh = "+t.getUncaughtExceptionHandler());
throw new RuntimeException();
}
}
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
public void uncaughtException(Thread t, Throwable e) {
System.out.println("caught "+e);
}
}
class HandlerThreadFactory implements ThreadFactory{
public Thread newThread(Runnable r) {
System.out.println(this + " creating new Thread");
Thread t = new Thread(r);
System.out.println("Created :"+t);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
System.out.println("eh = "+t.getUncaughtExceptionHandler());
return t;
}
}
public class CaptureUncaughtException {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());
exec.execute(new ExceptionThread2());
exec.shutdown();
}
}
评论