大家好,你能幫我解決我在 Java 程式中遇到的錯誤嗎?我使用回圈執行 Callable 實作,基本上我需要向另一個 Web 服務發送請求,并且我將收集回應 ID。根據我的測驗,我異步處理它的目標是使用以下實作。有一次我嘗試再次運行我的程式,然后我得到了這種錯誤“錯誤 500:java.lang.OutOfMemoryError:無法創建執行緒:retVal -1073741830,errno 11 ”。我所做的是我剛剛重新啟動了服務器,然后就可以了。
所以我想知道我的實作是否有問題?是否有任何額外的代碼行需要添加或洗掉以防止再次遇到此類錯誤?我只體驗過一次。希望你能幫助我
//pccsSurvList is a list of details coming from the database.
ExecutorService executorService = null;
List<Callable<SyncFlagEntity>> lst = new ArrayList<Callable<SyncFlagEntity>>();
if(pccsSurvList != null && pccsSurvList.size() > 0){
executorService = Executors.newFixedThreadPool(pccsSurvList.size());
for(PCCSSurveyInfoEntity user: pccsSurvList){
NotifyEmailTransactionImpl emailTransact = new NotifyEmailTransactionImpl(user);
lst.add(emailTransact);
}
}
// returns a list of Futures holding their status and results when all complete
List<Future<SyncFlagEntity>> tasks = new ArrayList<Future<SyncFlagEntity>>();
tasks = executorService.invokeAll(lst);
executorService.shutdown();
uj5u.com熱心網友回復:
java.lang.OutOfMemoryError: 創建執行緒失敗
此OutOfMemoryError表示 Java 記憶體不足。
問題很可能出在這條線上......
executorService = Executors.newFixedThreadPool(pccsSurvList.size());
您得到了很多行,但 JVM 沒有足夠的 RAM 來為每一行創建一個執行緒。嘗試記錄您獲得的行數,看看發生了什么。
uj5u.com熱心網友回復:
我認為您一次運行了太多行程。您應該嘗試設定限制并使用執行緒池。
也許你可以這樣做:
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(pccsSurvList.size());
然后在 for 回圈中,您可以執行以下操作:
executor.submit(() -> emailTransact);
這里還有更多:https : //www.baeldung.com/thread-pool-java-and-guava
還可以看看反應式編程。可以為您提供更多幫助:https : //www.vogella.com/tutorials/RxJava/article.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/352938.html
