JUC--黑马|JUC并发编程 -- 正确处理线程池异常
1. 正确处理线程池异常 1.1 如果不处理异常
示例代码:
package com.tian;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j(topic = "c.TestTimer")
public class TestTimer {public static void main(String[] args) throws ExecutionException, InterruptedException {ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.schedule(() -> {log.debug("task1");
// 主动写一个异常
int i = 1 / 0;
}, 1, TimeUnit.SECONDS);
pool.schedule(() -> {log.debug("task2");
}, 1, TimeUnit.SECONDS);
pool.schedule(() -> {log.debug("task3");
}, 1, TimeUnit.SECONDS);
}
}
运行结果:程序不会抛出任何的异常信息,直接把里面的任务执行完了,我们都不知道里面有没有发生异常。这样显然是不好的,下面介绍2种捕获异常的方式
文章图片
1.2 try / catch 捕获异常
示例代码:
package com.tian;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j(topic = "c.TestTimer")
public class TestTimer {public static void main(String[] args) throws ExecutionException, InterruptedException {ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
pool.schedule(() -> {// 主动捕获异常
try {log.debug("task1");
// 主动写一个异常
int i = 1 / 0;
} catch (Exception e) {log.debug("error: {}", e);
}
}, 1, TimeUnit.SECONDS);
pool.schedule(() -> {log.debug("task2");
}, 1, TimeUnit.SECONDS);
pool.schedule(() -> {log.debug("task3");
}, 1, TimeUnit.SECONDS);
}
}
运行结果:
文章图片
1.3 使用 Future
示例代码:
package com.tian;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@Slf4j(topic = "c.TestTimer")
public class TestTimer {public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService pool = Executors.newFixedThreadPool(1);
Future f = pool.submit(() -> {log.debug("task1");
// 主动抛出异常
int i = 1 / 0;
return true;
});
// 如果任务里面发生了异常 则 get方法会返回异常信息
log.debug("result:{}", f.get());
}
}
运行结果:【JUC--黑马|JUC并发编程 -- 正确处理线程池异常】
文章图片
推荐阅读
- JUC中ReentrantLock和AbstractQueuedSynchronizer原理解析
- JUC--CLH同步队列
- 【黑马程序员】永不凋零的蓝莲花
- Java|Java JUC ConcurrentLinkedQueue解析
- 【JUC】ArrayBlockingQueue之Condition应用
- 【JUC】CountDownLatch共享节点队列
- Java|Java JUC ReentrantReadWriteLock解析
- 【JUC】两图理解Condition的等待、唤醒逻辑
- 黑马头条-2020版-前端部分-前端项目初始化.p001
- Java JUC LockSupport概述