2014-11-14 64 views
0

我有問題,似乎有一些線程沒有正確終止。當我在調試模式下暫停其中一個線程時,我得到這個列表:線程不能正常結束

Thread [<14> pool-2-thread-1] (Suspended) 
    <VM does not provide monitor information> 
    Object.wait(long, int) line: not available [native method] 
    Thread.parkFor(long) line: 1205 
    Unsafe.park(boolean, long) line: 325  
    LockSupport.park(Object) line: 159 
    AbstractQueuedSynchronizer$ConditionObject.await() line: 2019 
    LinkedBlockingQueue.take() line: 413  
    ThreadPoolExecutor.getTask() line: 1013 
    ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker) line: 1073 
    ThreadPoolExecutor$Worker.run() line: 573 
    Thread.run() line: 841 

在我暫停它之前,它是「運行」而不是掛起。 我怎樣才能找到最好的線程?

+3

那麼,這個列表當然要比實際的代碼更有幫助。 –

+0

我不能在這裏寫下我的整個項目,我甚至不知道這是哪個線程......這就是我想要找出的 – Ginso

+1

1.創建線程時,可以用'setName()'命名它。 2.您應該調查線程的可運行實現在哪些條件下可以返回/終止。如果沒有這樣的條件(或從未滿足),那麼你已經得到了答案。 –

回答

0

此線程似乎是保留在線程池中的「備用」線程,正在等待某件事要做。它不執行你的代碼。

這是完全正常的。

+0

問題是,當我回到我的開始活動,然後再次執行相同的步驟時,它會爲此啓動一個新線程。因此,如果我經常這樣做,我會得到越來越多的線索。這不是很好,因爲我不需要任何舊線程。我怎樣才能取消這些?我發現使用Thread.currentThread()調用這個線程是有一定的意義的。我可以用這個線程來做什麼來終止它? – Ginso

+0

你有多少個線程?在這個鏈接中查看「核心和最大池大小」部分是否適合您的問題:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html它基本上說,達到配置的限制後,它會執行您所描述的任務:爲新任務啓動新線程。但是,一旦達到核心池大小,如果有閒置線程,則不應創建新的線程。 –