2013-10-26 79 views
3

一次線程是否完全運行一條語句,或者語句是否會分裂?Java:執行線程中的語句

例如,在下面的語句:

public void run() { 
    System.out.println(aString + ": " + ++index); 
} 

有哪些可能的執行次序?

回答

1

不,當Thread被預先佔用時,不能保證,因此你不能假定一個語句會自動完成。事實上,即使您的預增加++index操作也不會中斷(我們有AtomicInteger)。

枚舉可能的執行順序可能是沒有用的,因爲它們會一直從程序的一個運行改變到另一個(假設還有其他線程在運行)。這就是爲什麼我們有Lock s和synchronization爲多線程代碼帶來一些控制表象。

請參閱Concurrency瞭解更多詳情。

1

中斷可能發生在幾乎任何時候在指令級別。例如,字符串連接將由新字符串的構造組成,這些字符串將接受多條指令,其中任何一條都可能被中斷。該印刷品也將是可能中斷的另一個指令。

如果你想有一個線程執行的代碼段之前,其他線程完成一個操作的外觀爲:

同步關鍵字
http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

或者信號燈
http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

1

不能保證你的代碼/語句不會被另一個線程中斷。但你可以使用同步塊 -

public void run() 
{ 
    synchronized(this) { 
     System.out.println(aString+ ": " + ++index); 
    } 
} 

這將確保沒有線程在打印時試圖中斷另一個線程。

+0

您上次的陳述不正確。 synchronized關鍵字不會阻止其他線程中斷當前正在執行的線程,而是會阻止嘗試對同一對象或方法執行同步方法的所有其他線程。你可以在這裏查看。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – Tyler