java for循环 等待_java – 主题:忙等待 – 空循环
参见英文答案 > Is this starvation? 2个
在我们的大学课程中,我们学习了Threads并使用“Busy Waiting”方法作为在TrafficLight等待的汽车的示例.为此,我们构建了三个类:
> TrafficLight(实现Runnable)
>汽车(实现Runnable)
>主要
在我们的Main类中,我们启动两个Thread,一个是Car,另一个是TrafficLight. Car具有布尔属性hasToWait.这个类中的run()方法的工作方式是,只要hasToWait == true,它就可以通过while循环工作.要更改此设置,我们在Car类中使用notifyCar()方法,TrafficLight使用该方法. TrafficLight中的run()方法运行Thread.sleep()来模拟一定的等待时间.
我教授的一切都很好,但最终我遇到了严重的问题.只要Car类中的while循环为空.当我输入一个非空的System.out.println()时,它可以工作.但是如果Syso为空,则结果是不显示Run of Run方法.
当TrafficLight中的Thread.sleep()为0时,它也工作.它比空的while循环工作.
这是我的代码:
Car.java:
package trafficlight;
public class Car implements Runnable {
private boolean hasToWait = true;
public void run() {
this.crossTrafficLight();
}
public void crossTrafficLight() {
while(hasToWait){ for(int i = 0; i<20; i++){System.out.println("123");}} // Busy waiting
System.out.println("Auto fährt über Ampel");
}
public void notifyCar() {
this.hasToWait = false;
System.out.println("Test");
}
}
TrafficLight.java:
package trafficlight;
public class TrafficLight implements Runnable {
private Car car;
public TrafficLight(Car car) {
this.car = car;
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.car.notifyCar();
}
}
Main.java:
package trafficlight;
public class Main {
public static void main(String[] args){
Car car = new Car();
TrafficLight tl = new TrafficLight(car);
new Thread(car).start();
new Thread(tl).start();
}
}
问题出在哪儿?为什么它适用于我的教授而不是我的电脑?我使用JRE 1.7在Eclipse Juno中获得了1:1的代码
解决方法:
除了this other answer中所说的所有内容(只需用你的hasToWait代替完成该答案),代码在添加println时开始工作的原因如下:
> println是一种同步方法;
>你在两个线程中调用它;
>这会在两个线程之间创建一个先发生的关系;
>因此,对子线程可以看到对布尔标志的写入.
你可以说它开始大多是偶然的工作:你正在捎带println中正在进行的同步.
标签:java,eclipse,multithreading,busy-waiting
来源: https://codeday.me/bug/20190624/1280401.html
java for循环 等待_java – 主题:忙等待 – 空循环相关推荐
- java三种循环结构_Java的三种结构(循环结构)
一.循环的概念,组成,及类型 1.循环的概念: 程序通过某种条件,重复的执行一段逻辑代码 2.循环的组成: i.初始部分:用以判断的变量 ii.循环条件:决定是否继续循环的依据,一般为布尔表达式 ii ...
- java双重for循环流程图_JAVA程序逻辑中的循环结构
在上一篇文章中提到了程序逻辑通过顺序.分支.循环三种结构来实现的,并介绍了分支结构的执行语句,那么今天这篇文章介绍实现程序逻辑的另一种结构--循环结构. 什么是循环结构 循环结构是指在程序设计语言中按 ...
- debug调到循环最后_Java入门(7)——循环和debug 调试
循环: while 循环: 格式: int i = 0; ① //初始化条件 while(i < 10) { ② //判断条件 System.out.println(i); ④ //循环 ...
- java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...
线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...
- java 等待_Java并发之等待/通知机制
1 前言 本篇文章默认大家对synchronized跟ReentrantLock有一定了解. 1.1 先来段代码放松一下 下面一段简单的代码,主要是通过3个线程对count进行累计来进行模拟多线程的场 ...
- java等待_Java学习:等待唤醒机制
等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WAITIN ...
- java线程等待_java 中线程等待与通知的实现
java 中线程等待与通知的实现 前言: 关于等待/通知,要记住的关键点是: 必须从同步环境内调用wait().notify().notifyAll()方法.线程不能调用对象上等待或通知的方法,除非它 ...
- java线程唤醒与等待_Java线程的等待与唤醒
生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一 Thread中重要方法 void wait() 在其他线程调用此对象的notify()方法或not ...
- java for的增强_Java基础之增强for循环
平时大家for循环应该用的不少,特别是增强for循环,简单快捷.但是在增强for中做删除操作,却会抛出java.util.ConcurrentModificationException,一起来看下. ...
最新文章
- Java学习笔记27
- 监控利器之 Prometheus
- Python内置函数(63)——super
- “该文件包含不能在当前代码页(936)中表示的字符,请将该文件保存为 Unicode 格式以防止数据丢失”
- IPC之哲学家进餐问题
- 27计算机表演赛命题,27届计算机表演赛命题搜索赛答案(数学3)
- ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings
- 全球增长最快域名解析商Top10:中国占据四席
- HashMap jdk1.7源码阅读与解析
- Polling 、Long Polling 和 WebSocket
- OpenVINO 部署 Mask-RCNN 实例分割
- 福建省计算机中职类高考400分多少名,重要参考!福建高职分类各院校近两年招生计划及分数线汇总来了,快收藏...
- iss版本服务器读取_【IIS7服务器管理工具下载】IIS7服务器管理 v2.1.9 官方版-开心电玩...
- eclipse + mapxtreme 代码示例1
- Spring框架中constructor-arg与property理解
- Starting zookeeper ... already running as process 30988.
- H5音乐播放器skPlayer,已支持拉取网易云音乐歌单。
- 一个简单的apk破解
- IOS-App Store 提审应用步骤
- excel - 逻辑表达式 (与,或,非)- 实例介绍(条件显示不同cell)