我有,我使用Java執行執行一些可運行的tomcat的web應用。如何「殺死」從一個執行線程?
首先我從我的遺囑執行人實例分配執行服務是這樣的:
executorService = Executors.newFixedThreadPool(nThreads, new MyThreadFactory(threadFactoryName))
然後,我用執行人服務發射任務:
executorService.execute(new MyRunnable);
然後,它似乎工作。但我的問題是,我在追逐某種泄漏的,我一個在運行的服務器後出現此錯誤:
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderCorePoolSize(ThreadPoolExecutor.java:703)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:652)
at something.server.ThreadExecutor.execute(MyRunnable.java:91)
我使用的Java VisualVM的上Tomcat實例跟蹤的線程分配。我看到,當我調用'newFixedThreadPool'時,我看到'nThreads'的新線程。但是他們的工作完成後,我發現線程的狀態處於「等待」狀態。
這是正常的嗎?我不相信它,我知道runnables完成他們的工作,但執行者服務從未釋放線程。我能做些什麼來解救他們,還是我完全超出了範圍?
不知道,我明白你的意思,但一個池真的意味着池中的對象(這裏是線程)被重用。所以這很正常......對於OOM:你是否使用ThreadLocals? –
我認爲有關* fixed * ThreadPool的所有內容都是它始終具有相同數量的線程?在你的ThreadFactory中,你可以給線程一個特定的名字,然後配置文件,如果它是來自該執行器的線程正在瘋狂?我想他們不是,這是一些其他的泄漏。 – Fildor
你在32位或64位操作系統上運行? – jtahlborn