2013-04-08 22 views
-2

假設我有一個像這樣一個靜態方法:調用靜態方法上一個新的線程

public static string ProcessMessage() 
{ 
    string testString = " this is test "; 
    .... 
    return testString ; 
} 

而另一種方法SendMessage函數:

public void SendMessage() 
{ 
    Thread th = new Thread(this.ProcessMessage); 
    th.Start(); 
    th.Join(); 
} 

會發生什麼事SendMessage函數是一個右後另一個叫幾次。

假設第一個線程調用ProcessMessage並在第一行,另一個線程調用ProcessMessage,第一個線程會發生什麼?它會永遠完成,因爲ProcessMessage是一個靜態方法? ProcessMessage屬性將如何?線程2會覆蓋線程1?

+4

恩,你似乎試圖在方法中聲明*屬性*。這是無效的。如果您要問我們代碼在執行時的表現如何,它需要是有效的代碼。 – 2013-04-08 15:12:34

+1

如果你試過你會得到'預計一個無效簽名的方法' – 2013-04-08 15:14:17

+0

在Jon的基礎上,你不能通過'this'調用'ProcessMessage',因爲它是一個靜態方法。如果它們在同一個類中,則應該使用類名稱或方法名稱。 – vlad 2013-04-08 15:15:31

回答

2

要回答您的一般問題,多個線程可以調用一個靜態方法,並且每個線程將分別處理該方法調用。如果在靜態方法中使用靜態變量,那麼由於這些變量在多個線程之間共享,您可能會遇到交叉線程問題,但方法代碼本身只是一組指令,任何線程都會進入它。

關於您的具體示例,Thread Constructor只能通過ParameterizedThreadStartThreadStart對象(可能還有Int32)。兩種類型的ThreadStart參數都是具有void簽名的委託(它們不能返回任何內容)。

此外,由於您打電話給Thread.Start,其次是Thread.Join。 Thread.Join阻塞調用線程,直到等待的線程完成。既然如此,從同一線程對SendMessage()的多次調用將永遠不會產生多個併發線程。相反,每次調用都會創建一個新線程,然後等待它完成,然後再繼續下一個SendMesage()調用。這只是簡單地在原始線程中調用ProcessMessage。