最近温习多线程通信,所以用多线程简单模拟了交通灯,感觉自己对线程方面的东西又有了进一步的理解。
通过这个模拟明白了notify(),与wait()又一些特点。
下面将代码贴上:
交通灯类:
package com.xxg.entiry;
public class Light {
public int num = 20;// 南北方向和东西方向总计时间为20秒
public String color;
public Light(String color){
this.color = color;
}
public synchronized void EtoW(){
while(true){
System.out.println("东西方向等候10秒,南北方向通行");
while(num>10)
{ try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
num--;
System.out.println(num-10+"-----------[当前线程为]--------"+Thread.currentThread().getName());
}
{
while(num<=10)
{
try {
notify();
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public synchronized void NtoS() throws InterruptedException{
while(true){
System.out.println("南北方向等候10秒,东西方向通行");
while(num>=10&&num<20)
{ try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
num++;
System.out.println(num-10+"------------[当前线程为]------------"+Thread.currentThread().getName());
}
if(num==20)
notify();
wait();
}
}
}
//======================实现控制东西方向的线程=====================
package com.xxg.inter;
import com.xxg.entiry.Light;
public class Threa1 extends Thread{
public Light light;
public Threa1(Light light) {
this.light = light;
}
public void run() {
light.EtoW();
}
}
//======================实现控制南北方法的线程=======================
package com.xxg.inter;
import com.xxg.entiry.Light;
public class Threa2 extends Thread{
public Light light;
public Threa2(Light light) {
this.light = light;
}
public void run() {
try {
light.NtoS();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//============================Test=============================
package com.xxg.test;
import com.xxg.entiry.Light;
import com.xxg.inter.Threa1;
import com.xxg.inter.Threa2;
public class Test {
public static void main(String[] args) {
Light li = new Light("red");
Thread t1 = new Threa1(li);
Thread t2 = new Threa2(li);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
}
}
//=========================测试结果================================
东西方向等候10秒,南北方向通行
9-----------[当前线程为]--------Thread-0
8-----------[当前线程为]--------Thread-0
7-----------[当前线程为]--------Thread-0
6-----------[当前线程为]--------Thread-0
5-----------[当前线程为]--------Thread-0
4-----------[当前线程为]--------Thread-0
3-----------[当前线程为]--------Thread-0
2-----------[当前线程为]--------Thread-0
1-----------[当前线程为]--------Thread-0
0-----------[当前线程为]--------Thread-0
南北方向等候10秒,东西方向通行
1------------[当前线程为]------------Thread-1
2------------[当前线程为]------------Thread-1
3------------[当前线程为]------------Thread-1
4------------[当前线程为]------------Thread-1
5------------[当前线程为]------------Thread-1
6------------[当前线程为]------------Thread-1
7------------[当前线程为]------------Thread-1
8------------[当前线程为]------------Thread-1
9------------[当前线程为]------------Thread-1
10------------[当前线程为]------------Thread-1
东西方向等候10秒,南北方向通行
收获:
1.wait()的进一步理解:如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
2.notify()方法为唤醒同一个对象的锁。比如说a.notify()方法之能唤醒对应a.wait()方法调用的线程,而不能唤醒b.wait()对应的线程。
调用notify()方法并不代表释放当前对象的锁。它只是去通知其他线程进入到锁池里面去,而这个线程也不一定立即获的对象锁。
分享到:
相关推荐
可以创建一个单独的线程来定期调用`changeState()`方法,模拟交通灯自动切换的过程。 此外,为了可视化交通灯的状态,可以使用Java Swing或JavaFX创建一个简单的图形用户界面(GUI)。这将允许用户直观地看到交通灯...
交通灯模拟程序是一种基于计算机编程的实践项目,主要用于教授学生如何使用特定的编程语言,如JAVA,来实现复杂的逻辑控制和多线程技术。在这个项目中,学生将学习到如何设计一个模拟真实世界交通规则的系统,这涉及...
在本项目中,“使用Java模拟交通信号灯”是一个典型的编程实践,主要涵盖了计算机科学中的并发处理、模拟与仿真以及软件工程的基本概念。这个毕业设计旨在通过编程实现一个交通信号灯控制系统,来理解和应用Java语言...
在本文中,我们将深入探讨如何使用Java编程语言来模拟交通灯系统。交通灯控制系统是城市交通管理中的核心组成部分,它确保了车辆和行人的安全流动。通过编写Java源代码,我们可以理解并实践基本的编程概念,如循环、...
Java交通灯简单GUI编程是一个基础的程序设计项目,它展示了如何使用Java Swing库来创建一个图形用户界面(GUI),模拟交通灯的周期性变化。在这个项目中,我们通常会涉及三个核心类:计数类、监听类和基于Swing的...
在本文中,我们将深入探讨如何使用Java编程语言模拟交通灯系统,这主要涉及到线程(Thread)和图形用户界面(GUI)的相关知识。这个小项目是基于书籍中的一个示例,经过改造后,使得它更接近于实际十字路口的交通灯...
本文将深入探讨如何使用Java语言来实现一个简单的交通灯控制系统。交通灯系统是城市交通流的关键组成部分,它通过红绿黄三色灯的交替变化来协调车辆和行人的通行。 首先,我们需要理解交通灯的基本工作原理。...
Java交通灯程序是一种模拟现实生活中交通信号灯运作的软件应用,通常用于教学目的,帮助学生理解和实践面向对象编程、多线程以及事件处理等Java核心概念。在这个大学JAVA课的作业中,学生们被要求设计一个能够模拟...
在这个交通灯系统中,我们可以创建一个窗口,用三个不同的JLabel分别代表红、黄、绿灯,通过改变这些标签的颜色来模拟交通灯的状态变化。 在设计多线程部分,我们需要考虑如何协调各个线程的执行顺序。一种常见方法...
在这个红绿灯演示程序中,可能会有三个线程分别代表红、绿、黄灯,每个灯的亮灭由一个单独的线程控制,以模拟真实的交通信号灯行为。 线程的同步和通信是多线程编程中的重要概念。为了确保红绿灯的正确交替,程序...
4. **主循环**:在主程序中,创建`TrafficLight`对象并进入一个无限循环,不断调用`switchState()`方法,模拟交通灯的运行。 ```java public static void main(String[] args) { TrafficLight light = new Traffic...
在本文中,我们将深入探讨如何使用Java编程语言来模拟现实生活中的交通红绿灯系统。这个系统的核心在于理解和应用线程同步、定时任务以及状态管理等关键概念。 首先,我们需要理解红绿灯的基本工作原理。一个典型的...
本案例通过 Java 多线程技术和 Amino 并发组件实现了一个简单的十字路口交通模拟程序。该程序不仅展示了如何有效地利用多线程技术解决复杂的并发问题,还提供了对交通信号灯控制系统的深入理解。通过对程序的设计、...
交通灯需要按照特定的顺序和间隔时间进行切换,这就需要用到Java的线程机制。`Thread`类或`Runnable`接口可能会被用来创建和管理这些交替进行的任务。同时,为了避免线程间的竞态条件,可能使用`synchronized`关键字...
通过定义状态之间的转换规则,可以模拟交通灯的周期性变化。 3. **多线程**:为了实现交通灯的并行操作,如南北向和东西向的灯交替变化,Java的多线程技术至关重要。可以使用`Thread`类或`Runnable`接口创建多个...
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向...
标题“信号灯模拟”指的是一个使用Java编程语言实现的程序,该程序旨在模拟交通信号灯的行为。在实际交通中,信号灯系统通过红、黄、绿三种颜色的变化来控制交通流,确保道路的安全和流畅。在软件开发中,模拟这种...
通过定义不同的状态转换规则,如定时器或感应器触发,我们可以模拟交通灯的周期性变化。 接下来,我们需要实现交通灯的控制逻辑。这可以通过事件驱动编程来完成,例如使用Java的`java.util.Timer`和`java.util....
【五星路口交通灯控制系统(Java版)】是一个基于Java编程语言实现的交通灯控制系统,专为模拟和管理复杂的交叉路口交通流而设计。这个系统利用Java的面向对象特性,为每个交通灯方向创建独立的对象,以实现灵活的...