最近温习多线程通信,所以用多线程简单模拟了交通灯,感觉自己对线程方面的东西又有了进一步的理解。
通过这个模拟明白了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()方法并不代表释放当前对象的锁。它只是去通知其他线程进入到锁池里面去,而这个线程也不一定立即获的对象锁。
分享到:
相关推荐
这是一个交通灯的程序可以运行的.可做JAVA课程设计的.
java课程设计模拟交通灯。
主要介绍了java 多线程交通信号灯模拟过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向...
java 编写的信号灯模拟程序 应用线程sleep
Java多线程设计模式part1.pdf
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向...
本系统实现车流量数据采集、交通灯的设计与控制、车辆实时分流、交通应急管制四个功能。车流量数据采集可以给交通信号灯时间显示和...交通信号灯的设计采用多线程技术,实现东西方向和南北方向交通灯交替显示。车辆分...
模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆。 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)实验报告,基础篇有JAVA环境搭建、Java语言基础、方法和数组、面向对象基础、Java常用类、继承与接口、成员访问控制与异常、JavaFX程序设计、Java...
交通灯系统 对于此项目,您必须使用 Java 编写并发交通灯系统 (TLS) 示例。... 您的工作是使用 Java 多线程代码对 TLS 进行编程和模拟。 TLS 管理南北 (NS) 街道和东西 (EW) 街道之间交叉路口的灯光。
学期分配交通模拟任务代码程序,模拟城市交通。 程序的输入是正确格式的道路地图、带有路线计划的车辆列表。 每辆车都将用自己的线程表示,并有自己的速度、加速度、与下一辆车的最小距离等。程序将尝试找到灯光的...