public class ThreadExecutor { private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new ThreadFactoryBuilder().setNameFormat("customThread %d").build()); @Test public void test() { IntStream.rangeClosed(1, 5).forEach(i -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } threadPoolExecutor.execute(() -> { int j = 1/0; });}); } }
Exception in thread "customThread 0" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Exception in thread "customThread 1" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Exception in thread "customThread 2" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Exception in thread "customThread 3" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Exception in thread "customThread 4" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Exception in thread "customThread 5" java.lang.ArithmeticException: / by zero at thread.ThreadExecutor.lambda$null$0(ThreadExecutor.java:25) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748)
public class ThreadExecutor { private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new ThreadFactoryBuilder().setNameFormat("customThread %d").build()); @Test public void test() { IntStream.rangeClosed(1, 5).forEach(i -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } threadPoolExecutor.execute(() -> { try { int j = 1 / 0; } catch (Exception e) { System.out.println(Thread.currentThread().getName() " " e.getMessage()); } }); }); } }
customThread 0 / by zero customThread 0 / by zero customThread 0 / by zero customThread 0 / by zero customThread 0 / by zero
new ThreadFactoryBuilder() .setNameFormat("customThread %d") .setUncaughtExceptionHandler((t, e) -> System.out.println(t.getName() "发生异常" e.getCause())) .build()
public class ThreadExecutor { private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new ThreadFactoryBuilder() .setNameFormat("customThread %d") .setUncaughtExceptionHandler((t, e) -> System.out.println("UncaughtExceptionHandler捕获到:" t.getName() "发生异常" e.getMessage())) .build()); @Test public void test() { IntStream.rangeClosed(1, 5).forEach(i -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } threadPoolExecutor.execute(() -> { System.out.println("线程" Thread.currentThread().getName() "执行"); int j = 1 / 0; }); }); } }
线程customThread 0执行 UncaughtExceptionHandler捕获到:customThread 0发生异常/ by zero 线程customThread 1执行 UncaughtExceptionHandler捕获到:customThread 1发生异常/ by zero 线程customThread 2执行 UncaughtExceptionHandler捕获到:customThread 2发生异常/ by zero 线程customThread 3执行 UncaughtExceptionHandler捕获到:customThread 3发生异常/ by zero 线程customThread 4执行 UncaughtExceptionHandler捕获到:customThread 4发生异常/ by zero
public class ThreadExecutor { private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(200), new ThreadFactoryBuilder() .setNameFormat("customThread %d") .setUncaughtExceptionHandler((t, e) -> System.out.println("UncaughtExceptionHandler捕获到:" t.getName() "发生异常" e.getMessage())) .build()); @Test public void test() { IntStream.rangeClosed(1, 5).forEach(i -> { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } Future<?> future = threadPoolExecutor.submit(() -> { System.out.println("线程" Thread.currentThread().getName() "执行"); int j = 1 / 0; }); try { future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } }); } }
线程customThread 0执行 java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero 线程customThread 0执行 java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero 线程customThread 0执行 java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero 线程customThread 0执行 java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero 线程customThread 0执行 java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
public void run() { try { Callable<V> c = callable; if (c != null && state == NEW) { V result; boolean ran; try { result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } if (ran) set(result); } } } protected void setException(Throwable t) { if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { outcome = t; UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state finishCompletion(); } }
public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); return report(s); }
private V report(int s) throws ExecutionException { Object x = outcome; if (s == NORMAL) return (V)x; if (s >= CANCELLED) throw new CancellationException(); throw new ExecutionException((Throwable)x); }