2013-03-05 40 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

相关问题