一次線程是否完全運行一條語句,或者語句是否會分裂?Java:執行線程中的語句
例如,在下面的語句:
public void run() {
System.out.println(aString + ": " + ++index);
}
有哪些可能的執行次序?
一次線程是否完全運行一條語句,或者語句是否會分裂?Java:執行線程中的語句
例如,在下面的語句:
public void run() {
System.out.println(aString + ": " + ++index);
}
有哪些可能的執行次序?
不,當Thread
被預先佔用時,不能保證,因此你不能假定一個語句會自動完成。事實上,即使您的預增加++index
操作也不會中斷(我們有AtomicInteger
)。
枚舉可能的執行順序可能是沒有用的,因爲它們會一直從程序的一個運行改變到另一個(假設還有其他線程在運行)。這就是爲什麼我們有Lock s和synchronization爲多線程代碼帶來一些控制表象。
請參閱Concurrency瞭解更多詳情。
中斷可能發生在幾乎任何時候在指令級別。例如,字符串連接將由新字符串的構造組成,這些字符串將接受多條指令,其中任何一條都可能被中斷。該印刷品也將是可能中斷的另一個指令。
如果你想有一個線程執行的代碼段之前,其他線程完成一個操作的外觀爲:
的同步關鍵字
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
不能保證你的代碼/語句不會被另一個線程中斷。但你可以使用同步塊 -
public void run()
{
synchronized(this) {
System.out.println(aString+ ": " + ++index);
}
}
這將確保沒有線程在打印時試圖中斷另一個線程。
您上次的陳述不正確。 synchronized關鍵字不會阻止其他線程中斷當前正在執行的線程,而是會阻止嘗試對同一對象或方法執行同步方法的所有其他線程。你可以在這裏查看。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – Tyler