Java:在线程中执行语句
线程是否一次完全运行一条语句,或者该语句是否会被拆分 例如,在下面的陈述中:Java:在线程中执行语句,java,multithreading,Java,Multithreading,线程是否一次完全运行一条语句,或者该语句是否会被拆分 例如,在下面的陈述中: public void run() { System.out.println(aString + ": " + ++index); } 可能的执行顺序是什么?不,当线程被抢占时,没有任何保证,因此您不能假设语句将以原子方式完成。事实上,即使您的预增量++index操作也不能保证在不中断的情况下完成(原因是我们有AtomicInteger) 枚举可能的执行顺序可能没有用,因为它们会不断地从一个程序运行到另一个程
public void run() {
System.out.println(aString + ": " + ++index);
}
可能的执行顺序是什么?不,当
线程
被抢占时,没有任何保证,因此您不能假设语句将以原子方式完成。事实上,即使您的预增量++index
操作也不能保证在不中断的情况下完成(原因是我们有AtomicInteger
)
枚举可能的执行顺序可能没有用,因为它们会不断地从一个程序运行到另一个程序运行(假设还有其他线程在运行)。这就是为什么我们有了s,并对多线程代码进行了一些貌似的控制
有关更多详细信息,请参阅。中断几乎可以在指令级别的任何时间发生。例如,字符串连接将由新字符串的构造组成,这些新字符串将接受多条指令,其中任何一条指令都可能被中断。打印也将是另一条可能中断的指令
如果希望某个线程在其他线程完成操作之前执行一段代码,请查看:
已同步关键字或锁定和信号量
无法保证您的代码/语句不会被其他线程中断。但您可以使用同步块-
public void run()
{
synchronized( this ) {
System.out.println(aString+ ": " + ++index);
}
}
这将确保打印时没有线程试图中断另一个线程。您的上一条语句不正确。synchronized关键字不会阻止其他线程中断当前正在执行的线程,而是会阻止尝试在同一对象或方法上执行同步方法的所有其他线程。你可以在这里查看。