参见英文答案 > 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 – 主题:忙等待 – 空循环相关推荐

  1. java三种循环结构_Java的三种结构(循环结构)

    一.循环的概念,组成,及类型 1.循环的概念: 程序通过某种条件,重复的执行一段逻辑代码 2.循环的组成: i.初始部分:用以判断的变量 ii.循环条件:决定是否继续循环的依据,一般为布尔表达式 ii ...

  2. java双重for循环流程图_JAVA程序逻辑中的循环结构

    在上一篇文章中提到了程序逻辑通过顺序.分支.循环三种结构来实现的,并介绍了分支结构的执行语句,那么今天这篇文章介绍实现程序逻辑的另一种结构--循环结构. 什么是循环结构 循环结构是指在程序设计语言中按 ...

  3. debug调到循环最后_Java入门(7)——循环和debug 调试

    循环: while 循环: 格式: int i = 0; ①    //初始化条件 while(i < 10) { ②  //判断条件 System.out.println(i); ④ //循环 ...

  4. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  5. java 等待_Java并发之等待/通知机制

    1 前言 本篇文章默认大家对synchronized跟ReentrantLock有一定了解. 1.1 先来段代码放松一下 下面一段简单的代码,主要是通过3个线程对count进行累计来进行模拟多线程的场 ...

  6. java等待_Java学习:等待唤醒机制

    等待唤醒机制 线程的状态 NEW 至今尚未启动的线程处于这种状态 RUNNABLE 正在Java虚拟机中执行的线程处于这种状态 BLOCKED 受阻塞并等待某个监视器锁的线程处于这种状态 WAITIN ...

  7. java线程等待_java 中线程等待与通知的实现

    java 中线程等待与通知的实现 前言: 关于等待/通知,要记住的关键点是: 必须从同步环境内调用wait().notify().notifyAll()方法.线程不能调用对象上等待或通知的方法,除非它 ...

  8. java线程唤醒与等待_Java线程的等待与唤醒

    生产者和消费者必须使用同步代码块包裹起来,保证等待和唤醒只能有一个执行,同步使用的锁对象必须保证唯一 Thread中重要方法 void wait() 在其他线程调用此对象的notify()方法或not ...

  9. java for的增强_Java基础之增强for循环

    平时大家for循环应该用的不少,特别是增强for循环,简单快捷.但是在增强for中做删除操作,却会抛出java.util.ConcurrentModificationException,一起来看下. ...

最新文章

  1. Java学习笔记27
  2. 监控利器之 Prometheus
  3. Python内置函数(63)——super
  4. “该文件包含不能在当前代码页(936)中表示的字符,请将该文件保存为 Unicode 格式以防止数据丢失”
  5. IPC之哲学家进餐问题
  6. 27计算机表演赛命题,27届计算机表演赛命题搜索赛答案(数学3)
  7. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings
  8. 全球增长最快域名解析商Top10:中国占据四席
  9. HashMap jdk1.7源码阅读与解析
  10. Polling 、Long Polling 和 WebSocket
  11. OpenVINO 部署 Mask-RCNN 实例分割
  12. 福建省计算机中职类高考400分多少名,重要参考!福建高职分类各院校近两年招生计划及分数线汇总来了,快收藏...
  13. iss版本服务器读取_【IIS7服务器管理工具下载】IIS7服务器管理 v2.1.9 官方版-开心电玩...
  14. eclipse + mapxtreme 代码示例1
  15. Spring框架中constructor-arg与property理解
  16. Starting zookeeper ... already running as process 30988.
  17. H5音乐播放器skPlayer,已支持拉取网易云音乐歌单。
  18. 一个简单的apk破解
  19. IOS-App Store 提审应用步骤
  20. excel - 逻辑表达式 (与,或,非)- 实例介绍(条件显示不同cell)

热门文章

  1. Netcdf中多变量导出代码示例
  2. 项目管理工具strber
  3. 24 | 二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
  4. Angular常用命令行和指令
  5. 接口(定义,使用方法)
  6. IT职业就业-学长有话说(二)
  7. 使用mybatis操作AS400数据库
  8. 洛谷P2480 [SDOI2010]古代猪文(卢卡斯定理+中国剩余定理)
  9. python开发学习笔记之六(面向对象)
  10. 16-1平衡树源代码