我只是编写了一个程序,使用两个线程轮流打印0-99。我使用同步块来完成任务。在我的代码中,当我使用“this”作为同步监视器时,程序工作得很好。但是当我使用“.class”作为同步监视器时,我得到了illegalMonitorStateException
。有人能说出发生了什么吗?
这是我的代码,运行良好
public class WaitTest implements Runnable {
private int n = 0;
@Override
public void run() {
while (true) {
synchronized (this){
notify();
if (n < 100) {
System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
++n;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else
break;
}
}
}
public static void main(String[] args) {
WaitTest waitTest = new WaitTest();
Thread threadA = new Thread(waitTest);
Thread threadB = new Thread(waitTest);
threadA.start();
threadB.start();
}
}
这是我的代码,我有一个例外
public class WaitTest implements Runnable {
private int n = 0;
@Override
public void run() {
while (true) {
synchronized (WaitTest.class){
notify();
if (n < 100) {
System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
++n;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else
break;
}
}
}
public static void main(String[] args) {
WaitTest waitTest = new WaitTest();
Thread threadA = new Thread(waitTest);
Thread threadB = new Thread(waitTest);
threadA.start();
threadB.start();
}
}
它们之间唯一的区别是同步后大括号中的内容
在我的代码中,当我使用“this”作为同步监视器时,程序工作得很好。
这是因为当您调用wait()
和notify()
方法时,您是从this
返回的实例隐式调用它们,该实例与您的synchronized子句(即synchronized(this)
)中使用的对象相匹配。
但是当我使用“.class”作为同步监视器时,我得到了IllegalMonitorStateException。
发生这种情况的原因是,您同步了WaitTest.class
类,但为This
实例再次调用了Wait
和Notify
方法。因此,要避免该异常,请更改wait()的调用;将notify();
分别添加到waittest.class.wait();
和waittest.class.notify();
。
修正的代码:
public class WaitTest implements Runnable {
private int n = 0;
@Override
public void run() {
while (true) {
synchronized (WaitTest.class){
WaitTest.class.notify();
if (n < 100) {
System.out.println(Thread.currentThread().getName() + " " + Integer.toString(n));
++n;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
WaitTest.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else
break;
}
}
}
public static void main(String[] args) {
WaitTest waitTest = new WaitTest();
Thread threadA = new Thread(waitTest);
Thread threadB = new Thread(waitTest);
threadA.start();
threadB.start();
}
}
我刚开始使用线程,一调用wait方法就会得到一个IllegalMonitorStateException,有人能帮我吗
我有个问题。当我在synchronized块中使用时,我有IllegalMonitorStateException。有谁能帮我解决这个问题吗? 我必须这样做,一个线程将发送到第二个线程char,然后这个线程必须等待和第二个线程打印这个char。在第二个线程等待之后,第一个线程再次发送下一个字符 main.java:
问题内容: 我正在Swift iOS应用程序中使用类型的参数列表来保存一些最终将传递给Web服务的参数。如果我将Bool保存到此字典中然后打印,它会显示为“ Optional(1)”,因此正在将其转换为int。我无法发送一个int,并且需要将其设为“ true”。下面的示例代码。 我怎样才能将其保存为实际的true / false值而不是整数? 注意事项 这与AFNetworking一起使用,因此
我在下面的代码中的处获得了一个concurrentModificationException。我怎样才能避免这种情况呢? 这是stacktrace的顶部
问题内容: 我在Java中为程序使用多线程。我已经成功运行了线程,但是当我使用线程时,它正在抛出。如何使线程等待通知它? 问题答案: 你需要先行一步才能工作。 另外,我建议你查看并发程序包,而不是旧式的线程程序包。它们更安全,更易于使用。 快乐的编码。 编辑 我以为你的意思是,当你尝试在不持有对象锁定的情况下获取访问权限时会发生异常。
问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个地方,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6 之前的版本中进行操作