2012-05-04 20 views
6

至於我能理解從java.lang.Thread文檔,並從這裏張貼在計算器其他的問題,比如「How to access a Runnable object by Thread?」和「Get current instance of Runnable」這是不可能得到嵌入ThreadRunnable對象的引用。爲什麼無法將Runnable嵌入到線程中?

有這種可能性的場景是有用的是當實現一個方法,其簽名不能被修改,因爲我們重寫了另一個類或接口定義的方法,並且需要執行不同的操作,具體取決於嵌入在當前Thread中的Runnable類型。

如果我們的方法。例如在Thread類稱爲getRunnable,我們可以做這樣的事情:

if (Thread.currentThread().getRunnable() instanceof Type1) { 
    // do something... 
} else { 
    // do something else... 
} 

這可能在以下情況下也很有用,當我們想確保這一個方法的操作只能由某些線程執行而不能由其他線程執行。

所以我想知道,爲什麼Java開發人員決定不允許從Thread獲得Runnable實例,或者這是一個值得通知的缺失功能嗎?如果您認爲選擇背後沒有理由,但不值得將其作爲缺失功能通知,那麼您將在上述場景中使用什麼策略?

+0

會是什麼 「可運行」 爲用'main'方法在主線程? –

+2

@KirkWoll,'null'? –

+4

像你在你的例子中那樣''instanceof'的結果分支幾乎不是一個好主意。 – NPE

回答

11

所以我想知道,有沒有一個具體的理由爲什麼Java開發人員決定不允許從一個線程

這很可能只是沒有要求得到了Runnable實例。 Runnable本身應該能夠識別自己的類,因此它需要獲取該信息的想法很奇怪。它也可能是一種保護,使其他線程無法訪問正在另一個線程中運行的類。

如果您需要從應用程序的其他部分訪問當前Runnable,那麼我建議您使用ThreadLocal<Runnable>。在您的run()方法中,您可以設置它,然後在其他類中檢索它。但是,您需要將ThreadLocal放置在全球可訪問的位置。

您也可以處理當前的堆棧跟蹤以找出封閉的Runnable類,這更類似於黑客,但它會起作用。

5

有幾個方法,你可以採取來解決這個問題:

讓您Runnable s的映射正在執行他們(或者用Map<Thread, Runnable>或用ThreadLocal<Runnable>
使用反射Thread小號從Thread訪問Runnable

private static final Field target; 
static { 
    Field f = null; 
    try { 
     f = Thread.class.getDeclaredField("target"); 
     f.setAccessible(true); 
    } catch (NoSuchFieldException e) { 
     // might happen in a different version of Java (works in Java 7) 
     e.printStackTrace(); 
    } 
    target = f; 
} 

public static Runnable getTarget(Thread t) { 
    try { 
     return (Runnable) target.get(t); 
    } catch (IllegalAccessException e) { 
     // shouldn't happen, we already made the field accessible when we created it 
     e.printStackTrace(); 
     } 
    return null; 
} 
0

有一種間接的方法可能會有所幫助,你可以得到的堆棧跟蹤。

StackTraceElement[] stackTraceElement = thread.getStackTrace(); 
for(StackTraceElement e :stackTraceElement){ 
    System.out.println("Trace "+e.getClassName()); 
} 

輸出:

跟蹤的java.lang。螺紋

跟蹤com.emc.multithreading.RunnableDemo

跟蹤java.lang.Thread中

相關問題