踩坑記錄:
在方法内部需要異步采用多線程處理不同的任務,待多線程都處理完成時在進行組裝傳回結果:
情景是擷取文章資訊時需要補充目前登入使用者關注點贊以及發帖使用者資訊,需要多線程之下,是以在方法内部定義
CountDownLatch waiter = new CountDownLatch(3);
每次調用完成時都調用waiter.countDown();進行減1操作,總共三個邏輯調用三次,最後調用waiter.await();執行後續組裝邏輯。
但是執行過程中線上程調用時出現異常,導緻waiter.countDown()未執行到,waiter不能減為0,執行await一直等待,導緻線程阻塞,dubbo線程數全部阻塞不能處理新的請求或者是記憶體溢出服務崩潰。
最後經過jstact綜合jmap排查定位到原因,将線程方法try catch住在finally中執行waiter.countDown()。排查方法粗見:
https://blog.csdn.net/zpflwy1314/article/details/95382353