Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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中从同步上下文调用Thread.sleep()_Java_Multithreading_Synchronized_Thread Sleep - Fatal编程技术网

在Java中从同步上下文调用Thread.sleep()

在Java中从同步上下文调用Thread.sleep(),java,multithreading,synchronized,thread-sleep,Java,Multithreading,Synchronized,Thread Sleep,我已经读到Thread.sleep()将暂停当前正在运行的线程一段指定的时间,之后它将返回到可运行状态,等待轮到它运行 另外,如果从synchronized上下文调用,sleep()不会释放它所持有的锁。所以我想知道它什么时候会释放锁。如果处于睡眠状态的线程永远没有机会运行,那么它将始终保持自身的锁,然后其他线程如何进入同步方法/块 我不确定我问的问题是否正确。但是请帮帮我 所以我想知道它什么时候会释放锁 它将在退出synchronized块时释放锁,而不是更早 如果处于睡眠状态的线程永远没有机

我已经读到
Thread.sleep()
将暂停当前正在运行的线程一段指定的时间,之后它将返回到可运行状态,等待轮到它运行

另外,如果从
synchronized
上下文调用,
sleep()
不会释放它所持有的锁。所以我想知道它什么时候会释放锁。如果处于睡眠状态的线程永远没有机会运行,那么它将始终保持自身的锁,然后其他线程如何进入同步方法/块

我不确定我问的问题是否正确。但是请帮帮我

所以我想知道它什么时候会释放锁

它将在退出
synchronized
块时释放锁,而不是更早

如果处于睡眠状态的线程永远没有机会运行,那么它将始终保持自身的锁,然后其他线程如何进入同步方法/块

很简单,其他线程将无法输入与休眠线程在同一对象上同步的代码


总之,从
synchronized
块调用
Thread.sleep()
可能不是一个好主意。

如果使用
Object.wait
而不是
Thread.sleep
,则同步块的锁将被释放。

实际上,调用
Thread.sleep()
可能根本不是一个好主意。如果你现在能做什么,你应该现在就做。如果你必须在做任何事情之前等待,你应该等待,而不是睡觉。@DavidSchwartz:我同意。虽然
Thread.sleep()
有合法的用途,但它经常在不应该使用的地方使用。解释得很好,但说“总而言之,从同步块调用Thread.sleep()可能不是一个好主意。”太过分了。有时你想等待并保持锁定。如果你在等待电话铃响,你应该等待电话铃响。你不应该在4秒钟内睡觉,然后检查你睡觉时电话是否响了。如果您正在等待什么,您应该等待,而不是等待。允许调用API的代码应该使用计时器触发对
notify
的调用。进行API调用的代码应该使用
wait
等待权限。即使您将这两个功能组合成一段代码,操作也将由计时器触发,因此无需调用
sleep
。与其让线程等待某件事情发生以便它可以工作,不如让发生的事情导致工作完成,这样就不需要等待。