Java:在线程中执行语句

时间:2013-10-26 17:06:52

标签: java multithreading

一个线程一次完全运行一个语句,还是语句被拆分?

例如,在下面的声明中:

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

可能的执行订单是什么?

3 个答案:

答案 0 :(得分:1)

不,当Thread被抢占时无法保证,因此您无法假设语句将完成原子。实际上,即使您的预增量++index操作也不会在没有中断的情况下完成(我们原因AtomicInteger)。

列举可能的执行命令可能没有用,因为它们会不断地从程序的一次运行转换到另一次运行(假设还有其他线程在运行)。这就是为什么我们有Locksynchronization来对多线程代码进行一些控制。

有关详细信息,请参阅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);
    }
}

这将确保没有线程在打印时尝试中断另一个线程。