- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 wait() 和 notifyAll() 方法的小问题。该代码模拟两个线程的“竞争”。
让我们看一下代码 - 问题是,notifyAll() 方法对等待线程不执行任何操作,导致 main 方法首先获得锁...简单的解决方案是设置一些延迟(请参阅注释行)。但这是一个不好的做法。这个问题有什么好的解决办法吗?我希望仅使用 wait/notifyAll/join 方法。
public class TestThreads {
public static void main(String[] args) throws InterruptedException {
System.out.println("_start main");
Object lock = new Object();
Thread t1 = new Thread(new Car("Red car", lock));
Thread t2 = new Thread(new Car("Black car", lock));
t1.start();
t2.start();
//Thread.sleep(10L);
synchronized (lock){
System.out.println("Let`s go!");
lock.notifyAll();
}
t1.join();
t2.join();
System.out.println("_exiting from main...");
}
}
class Car implements Runnable {
private final String name;
private final Object lock;
public Car(String name, Object lock) {
this.name = name;
this.lock = lock;
}
@Override
public void run() {
int distance = 100;
synchronized (lock){
try{
System.out.println(name + " waiting...");
lock.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println(name + " started...");
while (distance != 0){
try{
Thread.sleep((long) (100 * Math.random()));
}catch (InterruptedException e){
e.printStackTrace();
break;
}
distance--;
if (distance % 20 == 0 && distance != 0){
System.out.println(name + " " + distance+ " miles left");
}
else if (distance == 0){
System.out.println(name + " finished race!!!");
}
}
System.out.println("_exiting from thread of " + name + " move simulation...");
}
}
PS。抱歉我的英语不好。
谢谢您的回答。那么,这个解决方案是不是更好呢?
public class TestThreads {
public static void main(String[] args) throws InterruptedException {
System.out.println("_start main");
LightSignal lock = new LightSignal();
Thread t1 = new Thread(new Car("Red car", lock));
Thread t2 = new Thread(new Car("Black car", lock));
t1.start();
t2.start();
synchronized (lock){
Thread.sleep(1000L);
lock.isGreen = true;
System.out.println("Let`s go!");
lock.notifyAll();
}
t1.join();
t2.join();
System.out.println("_exiting from main...");
}
}
class Car implements Runnable {
private final String name;
private final LightSignal lock;
public Car(String name, LightSignal lock) {
this.name = name;
this.lock = lock;
}
@Override
public void run() {
int distance = 100;
synchronized (lock){
try{
while (!lock.isGreen){
System.out.println(name + " waiting...");
lock.wait();
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println(name + " started...");
while (distance != 0){
try{
Thread.sleep((long) (100 * Math.random()));
}catch (InterruptedException e){
e.printStackTrace();
break;
}
distance--;
if (distance % 20 == 0 && distance != 0){
System.out.println(name + " " + distance + " miles left");
}
}
System.out.println(name + " finished race!!!");
System.out.println("_exiting from thread of " + name + " move simulation...");
}
}
class LightSignal {
public boolean isGreen = false;
}
最佳答案
当你调用notifyAll()时,你需要改变一个状态,当你在waiting()时,你需要循环检查该状态。如果您不这样做
在这种情况下,最简单的解决方案就是不要担心。您正在等待长达 100 毫秒的随机延迟,因此尝试同步此类随机系统的启动不太可能产生太大影响。
我认为当循环退出时“竞赛结束”,您不需要为此使用 if
子句。
关于java - 调用notifyAll有什么好的解决方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16400414/
我的程序应该使用线程(为了学习线程)按顺序打印出从 1 到 10 的数字。问题是程序陷入僵局。这是为什么? 我像这样创建 10 个线程: for (int i = 0; i < 10; i++) {
这是我的代码,每次运行代码时输出都会有所不同。有时,所有三个读者都会收到通知,输出为: 等待计算... 等待计算... 等待计算... 完成 总计:4950Thread-1 总计:4950Thread
我正在编写一个小Java程序,我需要在其中创建线程(代码中的哲学家),而这些哲学家需要在思考、饥饿和进食之间改变状态。我对这个项目还没有那么深入,我有下一个问题: public class NewMa
这是来自线程的代码块: synchronized(lock) { lock.notifyAll(); System.out.println("waking other threads
假设我有一个用 Java 实现的读/写监视器。 多个读取器或一个写入器可以同时访问数据库(不能同时访问) class RWmonitor{ private int readers = 0;
我正在尝试使用线程在 Java 中实现 Bully 算法。 这是我写的代码。 package newbully; public class NewBully { public static v
我想我应该说的第一件事是我不是在寻找解决方案,这是 hwk,但它运行正确,对我有很大帮助的是澄清.. 我们刚刚在我的面向对象编程类(class)中介绍了线程,并收到了我完成的作业。在我的代码中,我从不
在下面的代码中调用了 notifyAll() 但没有重新激活其他线程。我得到的输出是 beta 等待通知时间:1441870698303,activeWriters:1 alpha 等待通知时间:14
此代码从两个不同的线程打印偶数/奇数。在这里,我的程序卡在 wait() 中,无法使用 notifyAll() 唤醒 sleep 线程。 想知道为什么notifyAll无法唤醒所有 hibernate
所以,我有以下对象(为示例而简化): public class SomeListener implements EventListener{ public final Object lock
我正在做一个练习,模拟商店中具有多个线程的等待队列。 我有一个等候名单和 2 个柜台当某个客户端排在等待列表的第一位并且柜台有空闲时,该客户端进入柜台等待2秒,通知其他客户端然后离开。 我不明白为什么
我不理解 Java 并发实践书中的以下片段: 当只有一个线程可以取得进展时使用 notifyAll 是低效的 - 有时是一点点,有时是非常低效。如果有 10 个线程在一个条件队列上等待,调用 noti
public class ShareResource { private int n = 0; public synchronized void p() throws InterruptedExcep
import java.math.BigInteger; class Numbers { final static int NUMBER = 2; final static int P
我已经使用 JVMTI 实现了一个简单的分析器来显示对 wait() 和 notifyAll() 的调用。作为测试用例,我正在使用。 producer consumer example of Orac
我想知道在这种情况下会发生什么:我有 10 个线程在某些 lockObject 上等待(使用 wait)和 1 个线程(我们称之为 X 线程)试图进入由 lockObject 同步的 block 。那
我有一个有两种方法的类,一个发送消息,另一个确认消息已被接收/处理 public void send(OTAHotelAvailRS otaHotelAvailRS) throws Except
这是我编写的多线程队列的小片段, synchronized void add(int i) { if (count == size) { System.out.println(
所有线程都可以等待,但只能通知1个线程(最后一个线程)。如何notifyAll所有线程? public class Server { static Socket clientSocket; sta
我正在开发一个Java应用程序,当按下GUI中的按钮时,用户可以单击屏幕上的任意位置来记录他们单击的位置的x和y坐标。 这是通过以下方式完成的在整个屏幕上放置一个未修饰的、部分透明的 JFrame,用
我是一名优秀的程序员,十分优秀!