我试图延迟 - 或者让我睡觉 - 我的Java程序,但是发生了错误.
我无法使用Thread.sleep(x)或wait().出现相同的错误消息:
未报告的异常java.lang.InterruptedException; 必须被抓住或宣布被抛出.
在使用Thread.sleep()或wait()方法之前是否需要任何步骤?
什么是Java中并发编程中引用的监视器?
当我读到"每个对象都有一个监视器"这是什么意思?
这是一个特殊的对象吗?
今天,我有一个采访上,我问候选人很平常和基本的问题有关的区别Thread.sleep()和Object.wait().我希望他回答类似这样的事情,但他说这些方法基本上都是一样的,很可能Thread.sleep是Object.wait()在里面使用,但sleep本身并不需要外部锁定.这不是一个正确的答案,因为在JDK 1.6中,此方法具有以下签名.
public static native void sleep(long millis) throws InterruptedException;
Run Code Online (Sandbox Code Playgroud)
但我的第二个想法是,这不是那么荒谬.可以使用定时等待来实现相同的效果.看一下下面的代码片段:
public class Thread implements Runnable {
private final Object sleepLock = new Object();
// other implementation details are skipped
public static void sleep(long millis) throws InterruptedException {
synchronized (getCurrentThread().sleepLock){
getCurrentThread().sleepLock.wait(millis);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,sleepLock是一个特别用于sleep方法内同步块的对象.我假设Sun/Oracle工程师知道Occam的剃须刀,因此sleep本地实现是故意的,所以我的问题是为什么它使用本机调用.
我想出的唯一想法是假设有人可能会找到有用的调用Thread.sleep(0).根据这篇文章对调度程序管理有意义:
这具有清除当前线程的量子并将其置于队列末尾以获得其优先级的特殊效果.换句话说,所有具有相同优先级的可运行线程(以及具有更高优先级的线程)将有机会在下一个给定CPU时间产生的线程之前运行.
所以一个synchronized块会带来不必要的开销.
您是否知道在Thread.sleep()实施中不使用定时等待的任何其他原因?
如何在java中停止或中断睡眠线程?我有一个同步数据并在run()方法中休眠10分钟的线程,如果我想通过在线程休眠时停止线程来停止同步.怎么能实现这一目标?
关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException和处理InterruptedException 的原因.但是,它们都没有告诉我InterruptedException的可能来源.
那些OS信号如SIGTERM,SIGQUIT,SIGINT?在命令行上按CTRL-C会产生InterruptedException吗?还有什么?
首先,我想告诉您这个问题与Java中的本机实现无关.我从该线程中获得了许多有用的信息.
我想知道原生实现的代码是否可用?我有JDK的源代码,但我无法找到本机代码System.currentTimeMillis或Runtime.getRuntime().availableProcessors()或其他本地方法.
我如何等待变量在线程中更改?例如,我想等一个数字来改变.那么而不是使用Sleep()其他什么?
while SomeVariable > 0 do
Sleep(1);
Run Code Online (Sandbox Code Playgroud) 到目前为止,我对wait()和yield()方法的理解是,当线程没有执行任何任务并让CPU执行其他一些线程时,会调用yield().当一些线程被搁置并且通常用于同步的概念时,使用wait().但是,我无法理解其功能的差异,我不确定我所理解的是对还是错.有人可以解释它们之间的区别(除了它们存在的包装).
我遇到了一个问题,其中海报试图让一个线程等待一秒钟.他们正在使用wait,但在一个synchronized街区之外,因此它崩溃了.
给定一个正在运行的线程,暂停执行给定时间,可以执行以下操作:
Thread.sleep(1000);
Run Code Online (Sandbox Code Playgroud)
这应该也可以,并且具有非常相似的结果:
synchronized(this) {
this.wait(1000);
}
Run Code Online (Sandbox Code Playgroud)
使用wait超时,线程将在1秒后取消暂停.
问题是:如果我没有任何监控和通知问题,是否有实际的理由使用一个而不是另一个?
我在不同的博客中读过有关显示器的不同内容.所以我现在有点困惑.
据我所知,monitor是一个确保只有一个线程在关键部分执行代码的人.那么如果我们有3个同步的方法/块,那么我们将有3个监视器来确保只有一个线程在临界区?
如果以上是真的那么为什么说在Java中每个对象都有一个与之关联的监视器?它应该是每个同步块与监视器相关联.