2013-03-05 81 views
0

採取線程轉儲的Java應用程序後,多個線程是出現在以下狀態:線程處於RUNNABLE狀態,但堆棧跟蹤顯示正在處理?

Thread [email protected] 
    java.lang.Thread.State: RUNNABLE 
    at xmlpdf.text.Word.allocateArrays(Word.java:205) 
    at xmlpdf.text.Word.calculateWidth(Word.java:237) 
    at xmlpdf.text.TextFormatter.format(TextFormatter.java:167) 
    at xmlpdf.text.TextFormatter.formatToWidthImpl(TextFormatter.java:116) 
    at xmlpdf.text.TextBlock.formatToWidthImpl(TextBlock.java:71) 
    at xmlpdf.tables.TextCell.formatToWidthImpl(TextCell.java:45) 
    at xmlpdf.tables.Cell.formatToWidth(Cell.java:349) 
    at xmlpdf.tables.Row.assignCellWidths(Row.java:97) 
    at xmlpdf.tables.Table.layout(Table.java:354) 
    at xmlpdf.tables.Table.formatRowsToWidth(Table.java:329) 
    at xmlpdf.tables.Table.formatToWidthImpl(Table.java:373) 
    at xmlpdf.Block.formatToWidth(Block.java:57) 
    at xmlpdf.renderer.Page.formatWidthAndHeight(Page.java:200) 
    at xmlpdf.renderer.Page.addBlockWhichIsNotFooterWholePagesOnly(Page.java:1026) 
    ..... 

反覆線程轉儲(由線程名稱標識)中完全相同的狀態顯示這些相同的主題。通過JMX檢查還顯示這些線程正在運行4個小時。

問:
線程如何能夠在可運行狀態,但堆棧跟蹤它表明它是做什麼(在這種情況下,一些在xmlpdf類)?
我認爲RUNNABLE總是意味着,線程可用於處理任何新的任務。

+1

'RUNNABLE'指線程正在執行,它位於[javadoc](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.State.html)中。 – 2013-03-05 14:20:56

+0

我希望一個線程執行被稱爲RUNNING而不是..RUNNABLE似乎暗示 - 它可以運行,如果需要的話。 – Jasper 2013-03-07 07:12:24

回答

4

Thread.State.RUNNABLE API:在可運行狀態的線程在Java虛擬機中執行,但它可以從操作系統,諸如處理器在等待其他資源

+0

Evgeniy Dorofeev>本質上是一個沒有做任何事的線程,一個正在做某事的線程 - 都具有RUNNABLE狀態。如果不是,第一種情況的線程狀態是什麼(沒有做任何事情,即等待某個任務分配給它) – Jasper 2013-03-06 07:09:44

+0

等待任務分配的線程通常處於WAITING或TIMED_WAITING狀態。例如在ThreadPoolExecutor中,它看起來像workQueue.poll(keepAliveTime,TimeUnit.NANOSECONDS) – 2013-03-06 07:16:10