一次线程是否完全运行一条语句,或者语句是否会分裂?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