2012-06-11 25 views
6

我有一個問題。如果我有一個方法爲DoSomething()的對象,如果爲此方法創建多個線程,它是否可以工作,並且它將作爲它自己的單獨線程運行,是否可能並且有效?在對象的實例上爲同一方法創建多個線程

E.g.

public class SomeClass 
{ 
    public void DoSomething() 
    { 
     //somethings done here 
    } 
} 

public class MainProgram 
{ 
    public MainProgram() 
    { 
     InitializeComponents(); 
    } 

    protected override OnStart(string[] args) 
    { 
     SomeClass sc = new SomeClass(); 
     Thread workerOne = new Thread(() => sc.DoSomething()); 
     workerOne.Start(); 

     Thread workerTwo = new Thread(() => sc.DoSomething()); 
     workerTwo.Start(); //start a new thread calling same method 
    } 
} 

我希望那種解釋我的意思。這會工作或導致任何問題?

我正在寫一個程序,需要幾乎是實時軟件,我目前正在決定初始化SomeClass的新實例是否更好?

希望有人能回答。如果我的問題沒有意義,請評論,我會進一步解釋!

感謝,

Base33

PS的代碼專門針對

+0

你在什麼版本的C#/ .NET? – RobertMS

+0

必須鏈接:[Joe Albahari的免費電子書](http://www.albahari.com/threading/) –

+0

我是一名Java程序員。但仔細看看代碼後,似乎可以重用SomeClass的同一個實例。儘管只有一個線程能夠運行該方法,而另一個線程則等待輪到它。至少這是Java中發生的事情。 – CKing

回答

12

每個線程都有一個單獨的調用堆棧,所以是的他們都可以在同一個對象上使用相同的方法。事實上,如果需要,每個線程都可以(通過遞歸)在同一個實例上多次調用相同的方法

然而,什麼可能你絆倒是,如果你使用的是狀態在該對象(實例或靜態字段等,以及任何來自該州相關)。您需要確保您對任何共享狀態的訪問權限能夠充分考慮(並且可能是同步)多線程訪問。

3

是的,你可以做到這一點的例子:)寫。但是,您必須確保您的成員在該方法中的訪問是線程安全的。

如果您改變對象的狀態,您應該鎖定您的讀寫操作(而不是說任何特定的機制),或者驗證在任何給定時間中斷方法是無害的,並且另一個線程調用另一個線程仍然會正常工作

1

如果我有一個DoSomething()方法的對象,如果我爲這個方法創建多個線程,它是否可以工作,它會作爲一個獨立的線程運行嗎?

是的,這是可能的。在您的代碼示例中,DoSomething正在SomeClass的相同實例上調用。兩個線程都分享這個。您有兩個不同的線程,但共享一個實際對象。

這個工作還是會導致任何問題?

這完全取決於你的用例。它可能也可能不會。如果共享對象,則需要同步對它們的訪問。

1

它沒有問題。我將運行沒有任何錯誤。

這就像在這個對象上創建一個對象和調用方法兩次。只有事實是兩個發生調用相同的方法是在 不同的線程。

相關問題