多线程编程中,run
方法中的代码一定要用try...catch
包裹,否则会出现如下问题
-
run
方法中使用while
循环,没有try
和try
在while
外面是等价的,当run
方法中出现异常,会导致while
循环结束// 错误示例: @Override public void run() { while (true) { System.out.println("run"); } } // 错误示例: @Override public void run() { try { while (true) { System.out.println("run"); } } catch (Exception e) { System.out.println("error"); } } // 正确示例: @Override public void run() { while (true) { try { String key = queue.take(); DistinctRequest<?> request = (DistinctRequest<?>) localCacheService.getIfPresent(key); if (null != request) { LOGGER.info("处理请求:{}", request.getRouteId()); // 此处可能丢失最新的消息 localCacheService.invalidate(key); request.process(); } else { LOGGER.info("key:{} 请求已处理或请求已失效...", key); } } catch (Exception e) { LOGGER.error("RequestProcessorThread:{}", e.toString()); } } }
-
使用
ScheduledThreadPoolExecutor
执行周期任务时,Runnable
的run
方法中没有try
代码块,出现异常时会导致任务不再执行。如使用下面的方法创建周期任务ScheduledThreadPoolExecutor#scheduleWithFixedDelay