感谢:1、滑动验证页面
2、线程的异常捕获与线程池的异常捕获 execute与submit区别:线程的异常捕获与线程池的异常捕获 execute与submit区别_threadutil.execute-CSDN博客
原文:https://www.cnblogs.com/wscit/p/6100476.html
直接try/catch
@Test public void catchThreadPoolTest() {
ExecutorService threadPool = Executors.newFixedThreadPool(1);
try {
Runnable runnable = () -> { System.out.println("-----------submit---------------"); Object obj = null; System.out.println(obj.toString());
};
threadPool.submit(runnable).get();
} catch (Exception e) { System.out.println("---------submit Exception---------");
e.printStackTrace();
} System.out.println("-----------华丽的分割线---------------");
threadPool.execute(() -> {
try { Object obj = null; System.out.println(obj.toString());
} catch (Exception e) { System.out.println("---------execute Exception-----------");
e.printStackTrace();
}
});
}2、线程直接重写整个方法:
第一段代码仅限于execute方法,因为submit的异常在线程池定义那块捕获不到,只有get的时候才会抛出,并且影响主线程的进行
@Test
public void threadPoolTest() {
ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler( (t1, e) -> System.out.println(t1 + " throws exception: " + e)); return t;
});
threadPool.execute(() -> {
System.out.println("-----------execute---------------"); Object obj = null;
System.out.println(obj.toString());
System.out.println("-----------obj.toString---------------");
}); System.out.println("-----------afterExecue---------------");
}@Test public void catchedExecutor() {
ExecutorService executorService = Executors.newCachedThreadPool(new MyThreadFactory());
executorService.execute(new Task());
executorService.shutdownNow();
System.out.println("-----------start---------------");
}public class MyThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(new RewriteUncatchtExceptionHandler());
System.out.println("Thread[" + t.getName() + "] created."); return t;
}
}public class Task implements Runnable { public void run() {
System.out.println("执行任务");
int num = Integer.parseInt("TT");
}
}public class RewriteUncatchtExceptionHandler implements Thread.UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) {
System.out.println("我捕获到了线程池的异常");
}
}@Test public void rewriteUncaughtException() { Task task = new Task();
Thread thread = new Thread(task);
thread.setUncaughtExceptionHandler(new RewriteUncatchtExceptionHandler());
thread.start();
System.out.println("-----------start---------------");
}public class RewriteUncatchtExceptionHandler implements Thread.UncaughtExceptionHandler{ public void uncaughtException(Thread t, Throwable e) {
System.out.println("我捕获到了线程池的异常");
}
}public class Task implements Runnable { public void run() {
System.out.println("执行任务"); int num = Integer.parseInt("TT");
}
}@Test
public void rewriteAfterExecute() {
ExecutorService threadPool2 = new MyThreadPoolExecutor(1, 1, 1000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(10));
threadPool2.execute(() -> {
System.out.println("-----------execute---------------"); Object obj = null;
System.out.println(obj.toString());
}); System.out.println("-----------afterExecue---------------");
}public class MyThreadPoolExecutor extends ThreadPoolExecutor { public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
} protected void afterExecute(Runnable r, Throwable t) { if(t!=null){ System.out.println("MyThreadPoolExecutor "+t);
}
}
}1.
Thread t = new Thread();
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
LOGGER.error(t + " throws exception: " + e);
}
}); //如果是线程池的模式:
ExecutorService threadPool = Executors.newFixedThreadPool(1, r -> { Thread t = new Thread(r);
t.setUncaughtExceptionHandler(
(t1, e) -> LOGGER.error(t1 + " throws exception: " + e)); return t;
});