我正在尝试收集所有发生的异常计数和a中的异常名称,ConcurrentHashMap以便我应该知道该异常发生了多少次。
ConcurrentHashMap
因此,在我的catch块中,我有一个映射,该映射将继续添加异常名称,并且总计数出现。
下面是我which I have modified to always throw SQL Exception每次用于测试目的的代码,以便我可以看到异常计数是否正确。
which I have modified to always throw SQL Exception
所以某些情况下
1)如果我将线程10数选择为,将任务数选择为50,则在该图中,我可以看到该特定字符串的500个异常
10
50
2)但是,如果我选择的线程40数和任务数一样,500那么20000在该映射中看不到异常,它会显示19000。
40
500
20000
19000
我的问题是为什么?我在这里做什么错?
class Task implements Runnable { public static final AtomicInteger counter_exception = new AtomicInteger(0); public static ConcurrentHashMap<String, Integer> exceptionMap = new ConcurrentHashMap<String, Integer>(); @Override public void run() { try { //Making a db connection and then executing the SQL- } catch (SQLException e) { exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet()); } catch (Exception e) { } } }
更新:
如果我有类似的内容,我将Null Pointer Exception获得40个线程和4000个任务。为什么?
Null Pointer Exception
catch (SQLException e) { synchronized(this) { exceptionMap.put(e.getCause().toString(), counter_exception.incrementAndGet()); } }
也许正在发生这样的事情:
任务1-500:捕获异常,准备调用exceptionMap.put,从中获取counter_exception.incrementAndGet()传递给所述方法的数字
exceptionMap.put
counter_exception.incrementAndGet()
任务500:安排了原子整数计数器的数字500,因此它exceptionMap.put首先运行
任务1:已安排原子整数计数器的数字1,因此将其exceptionMap.put最后运行
现在,即使计数器为500,并且我们有500个异常,该异常消息仍与1关联,因为该消息是最近执行的。