一个线程一次完全运行一个语句,还是语句被拆分?
例如,在下面的声明中:
public void run() {
System.out.println(aString + ": " + ++index);
}
可能的执行订单是什么?
答案 0 :(得分:1)
不,当Thread
被抢占时无法保证,因此您无法假设语句将完成原子。实际上,即使您的预增量++index
操作也不会在没有中断的情况下完成(我们原因AtomicInteger
)。
列举可能的执行命令可能没有用,因为它们会不断地从程序的一次运行转换到另一次运行(假设还有其他线程在运行)。这就是为什么我们有Lock和synchronization来对多线程代码进行一些控制。
有关详细信息,请参阅Concurrency。
答案 1 :(得分: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
答案 2 :(得分:1)
无法保证您的代码/语句不会被其他线程中断。但是你可以使用synchronized块 -
public void run()
{
synchronized( this ) {
System.out.println(aString+ ": " + ++index);
}
}
这将确保没有线程在打印时尝试中断另一个线程。