2013-10-26 46 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