Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程睡眠未等待正确的数量_Java_Sleep - Fatal编程技术网

Java 线程睡眠未等待正确的数量

Java 线程睡眠未等待正确的数量,java,sleep,Java,Sleep,我尝试使用多线程系统,如果我没有及时收到答案,我会超时,并出现以下问题: 公共类proba6{ 公共静态void main(字符串[]args){ proba6 p=新的proba6(); 对于(int i=0;i限制:+estimatedTime+”>“+100000000”); }捕捉(中断异常e){ //TODO自动生成的捕捉块 e、 printStackTrace(); } } } 因此,在第一个周期中的大多数时间,estimatedTime小于100000000。在那之后,它工作得很

我尝试使用多线程系统,如果我没有及时收到答案,我会超时,并出现以下问题:

公共类proba6{
公共静态void main(字符串[]args){
proba6 p=新的proba6();
对于(int i=0;i<3;i++){
p、 循环();
}
}
公共无效周期(){
试一试{
long startTime=System.nanoTime();
睡眠(1000);
long-endTime=System.nanoTime();
长估计时间=结束时间-开始时间;
System.out.println(“估计时间>限制:+estimatedTime+”>“+100000000”);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
因此,在第一个周期中的大多数时间,
estimatedTime
小于100000000。在那之后,它工作得很好。你知道原因吗

好吧,假设“更小”的意思是“稍微小一点”,比如
estimatedTime=99999321
那么这是正常的

基本上你停止你的线程,这意味着操作系统需要发送一个中断,保存线程的当前状态,调用另一个线程来代替它,一秒钟后,系统需要再次唤醒你的线程。因此,它将检查是否有可用的计算时间,如果没有,它可能会尝试中断另一个线程(见上文),甚至可能会等待几微秒,让另一个线程停止。然后,它从先前停止的线程恢复状态并继续执行

看一下文档描述,他们说:

(…)但是,这些睡眠时间不能保证精确,因为它们受到底层操作系统提供的功能的限制。此外,睡眠时间可以通过中断来终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用sleep将在指定的时间段内暂停线程

假设“小”的意思是“稍微小一点”,比如
estimatedTime=99999321
那么这是正常的

基本上你停止你的线程,这意味着操作系统需要发送一个中断,保存线程的当前状态,调用另一个线程来代替它,一秒钟后,系统需要再次唤醒你的线程。因此,它将检查是否有可用的计算时间,如果没有,它可能会尝试中断另一个线程(见上文),甚至可能会等待几微秒,让另一个线程停止。然后,它从先前停止的线程恢复状态并继续执行

看一下文档描述,他们说:

(…)但是,这些睡眠时间不能保证精确,因为它们受到底层操作系统提供的功能的限制。此外,睡眠时间可以通过中断来终止,我们将在后面的部分中看到。在任何情况下,您都不能假设调用sleep将在指定的时间段内暂停线程


“小”有多小?线程代码在哪里?@pvpkiran睡眠时不需要自定义线程。它使线程“main”休眠,它在哪里说
thread.sleep()
是精确的?这里没有。纳米时代比现在晚了很多。因此,睡眠的ms可能仍处于ms分辨率(也称为精度),而不是ns。但实际上,规范并不能保证。很好,他们在短端出错。“小”是多少?线程代码在哪里?@pvpkiran睡眠时不需要自定义线程。它使线程“main”休眠,它在哪里说
thread.sleep()
是精确的?这里没有。纳米时代比现在晚了很多。因此,睡眠的ms可能仍处于ms分辨率(也称为精度),而不是ns。但实际上,规范并不能保证。很高兴他们在短边上犯了错误。如果这不是很准确或正确,我很抱歉。但是这个主题相当大和复杂。“发送一个中断”如果这不是非常精确或正确,我很抱歉。但是这个话题是相当大和复杂的,“发送一个中断”吗?