Java 给线程的最短时间

Java 给线程的最短时间,java,multithreading,performance,cpu,low-level,Java,Multithreading,Performance,Cpu,Low Level,我的问题是关于一般的线程(例如:在Java中) 问题是:当一个线程处于(Runnable-state)状态时,即:它正在执行,并且正在发出一条指令(比如通过调用方法addOneToX(int x)),线程是否可能在完成指令之前但在开始执行指令之后退出或停止其工作。换句话说,高级语言中的大多数指令被解码为特定于机器的语言,并在CPU中分解为若干机器周期(时钟周期)。因此,我想这是很清楚的,因此: 1>线程处于可运行状态的最短时间是多少 2>线程如何保存其状态,以便稍后再访问?(即:当它退出Runn

我的问题是关于一般的线程(例如:在Java中)

问题是:当一个线程处于(Runnable-state)状态时,即:它正在执行,并且正在发出一条指令(比如通过调用方法
addOneToX(int x)
),线程是否可能在完成指令之前但在开始执行指令之后退出或停止其工作。换句话说,高级语言中的大多数指令被解码为特定于机器的语言,并在CPU中分解为若干机器周期(时钟周期)。因此,我想这是很清楚的,因此:

1>线程处于可运行状态的最短时间是多少


2>线程如何保存其状态,以便稍后再访问?(即:当它退出Runnable状态并稍后返回以从停止位置继续时)

没有保证的最短时间

调度器决定时间片将是什么。通常,你可以期望从几分之一毫秒到大约100毫秒的任何时间。但是,这个值通常是动态的。此外,一个线程甚至可能会遇到一个极端情况,比如只运行一条恰好是I/O的指令,线程在该指令上阻塞并被推出CPU

高级语言指令最终被翻译成(可能)多个CPU指令。CPU指令是在不中断的情况下执行的原子部分,除了程序可以在两个指令之间的任何位置中断,即使在高级语言命令的中间也是如此。请注意,有一些特定的CPU指令(如原子get和set或get和increase)可用于线程同步

存储线程状态的基本(非常简化)思想是:将寄存器存储在RAM中,并存储指向当前指令的指针

线程处于可运行状态的最短时间是多少

大多数实际的Java实现都使用本机线程:也就是说,它们允许操作系统处理线程调度的细节。大多数现代操作系统提供各种线程调度算法的选择,大多数算法提供许多可配置的参数。你的问题没有单一的答案

几乎可以肯定,这将不到一秒钟。很可能不到100毫秒。除此之外,很难说

线程如何保存其状态,以便稍后再访问它

线程的状态(在大多数编程语言中,包括Java)由其调用堆栈和CPU寄存器组成。CPU寄存器包括一个指向调用堆栈顶部的寄存器、一个指向当前指令的寄存器,通常还有其他寄存器


当切换线程时,操作系统中断处理器(中断基本上强制立即调用函数),中断处理程序例程将所有CPU寄存器保存到为当前线程保留的内存位置。然后,它恢复其他线程的寄存器,并基本上“返回”到其他线程中断的位置。

1)没有最小值。2) 太复杂了,这里无法涵盖。当您选择的语言(Java)与机器指令相去甚远时,操作系统如何保存和恢复CPU的寄存器是否重要?您需要阅读一本关于操作系统、调度、时间切片、上下文切换等方面的好书。对于StackOverflow,这太宽泛了。相关:Thx用于回复。但我头脑中的逻辑(这可能是错误的)说,绝对最小值是一个机器周期,因为CPU的内部时钟以固定的速率产生这些(比如脉冲),以便(让我称之为低电平同步),其中每个脉冲都是绝对的内部操作。为了理解这一点,我发现这一点很重要,因为(让我称之为-高级同步)。我指的是同步(比如在Java中)。看,整个问题(当涉及到高级同步时)是这样的,每当两个线程访问一个方法时。。,如果说没有任何保证,那么我必须使用同步,这几乎是每次我在这种情况下的成本。所以我想通过低层次的理解来缩小这种陷阱的可能性。但是,如果有一些框架(说明)足以解决这个问题,那么我想这是可以的。