2010-03-15 110 views
2

當在Java中實例化一個對象時,它是否綁定到在其中實例化的線程?因爲當我匿名地在一個線程中實現一個接口並將其傳遞給另一個線程來運行時,它的所有方法都在原始線程中運行。如果它們綁定到它們的創建線程,那麼是否有創建一個可以在任何線程中調用它的對象?基本Java多線程問題

+0

你怎麼知道他們是「在原始線程中運行」? – 2010-03-15 04:56:46

+0

所以你創建了一個匿名類來實現一些接口。你怎麼「把它傳遞給另一個線程」?管?流?作爲線程的類構造函數的擴充? – Mark 2010-03-15 05:22:50

+0

好吧,我通過一條消息傳遞它。當另一個線程收到消息並嘗試運行代碼(即繪製代碼)時,它聲稱我正在從原始線程進行繪製,並且這是禁止的。 – veered 2010-03-15 16:24:04

回答

3

如果線程創建一個對象:

MyClass.staticMember = new Runnable() {...}; 

和螺紋調用該對象的一個​​方法:

MyClass.staticMember.run(); 

run()方法將在螺紋執行。

線程一個將簡單地繼續運行,無論它正在運行的任何代碼。

+0

那麼它絕對是在原始線程中運行對象的方法。它給我的錯誤非常具體。如果有任何幫助,這一切都在Android上,而不是一個標準的Java VM。 – veered 2010-03-15 16:29:10

+0

在我上面發佈的情況下,** run()**將始終無例外地在線程B中執行。發佈更多代碼,我們可能會提供幫助。 Mark對繪圖API的解釋聽起來很有用。 – Martin 2010-03-16 09:22:45

1

該對象沒有綁定到它創建的線程......只有在主線程上調用它們時,才能在主線程上執行這些方法。

這是比較容易看到哪個線程調用方法......只是做一個虛擬函數:

public threadDetect(string which) 
{ 
    System.out.println("Executed from " + which + " thread."); 
} 

在調用主線程:

threadDetect("main"); 

從子線程你電話:

threadDetect("child"); 

我不確定如果OP使用類似的方式來檢測哪個線程是exe切割方法,但這是做到這一點的一種方法。