这学期我们java课程的课程设计项目----交通信号灯的线程设计
实验目的:多线程设计,同步机制
题意 设计一个交通信号灯类:
变量:位置、颜色(红、黄、绿)、显示时间(秒)。
方法:切换信号灯。
创建并启动两个线程(东西向、南北向)同时运行。
实验要求
设计线程。
设计路口信号灯示意图界面。
进一步将每个方向的信号灯分成3种车道灯:左转、直行和右转。
根据车流量进行时间的模糊控制。
在课程设计的开始并没有仔细看老师的要求,只知道是交通信号灯。然后就开始各种找资料,百度,网上大量的关于红绿灯的设计都是参考张孝祥老师的教程,大概的设计方法是创建了三个类 lamp、road、lampcontrol。
然鹅......对.....然鹅又来了,在查了大概两天资料后,我又反过来看了一遍老师发的设计要求.....这这这.....,光控制灯就行了啊,不要车的啊,捂脸...
所以设计思路马上就变得清晰,根据张老师的做法,每个路口都有三个灯,分别为左转、直行、右转,所以一共有12盏灯。按照要求,右转灯为常亮灯,左转和直行灯才有红绿交替。在除去右转灯的八个灯里面,又可以分为四组可以两两匹配的灯,分别为东西左转南北(平行转垂直)、南北直行(垂直通行)、南北左转东西(垂直转平行)、东西直行(平行通行)。
于是我给这个12个灯编了个号:
emmm 大概就是这样,但是跟生活中的红绿灯不同,生活中的都是看对面路口的灯,我们这里是模拟嘛....就各个路口用各个路口的灯呗.....
大致解释一下,
1号灯为由南向西的左转灯,2号灯为由南向北的直行灯,3号灯为由南向东的右转灯。
4号灯为由东向北的右转灯,5号灯为由东向西的直行灯,6号灯为由东向南的左转灯。
7号灯为由北向西的右转灯,8号灯为由北向南的直行灯,9号灯为由北向东的左转灯。
10号灯为由西向北的左转灯,11号灯为由西向东的直行灯,12号灯为由西向南的右转灯。
然后根据匹配的原则,大概就是这么一张图:
我们就可以得到:
这四组信号灯。
到这里我们思路就很清晰了,我们可以分别为每一组信号灯开一个进程,然后使四个进程循环交替进行就实现了绿灯的转换。使用了程的同步技术。
当然,我们都已经开了四个进程了,为了锦上添花,我当然不介意再加个小车了hhhhhh
实验结果图:
源代码:
light类:
package traffic;
public class light {
int x,y; //灯在画布上的位置
boolean status; //灯的状态
public light(int x,int y,boolean islight) {
this.x=x;
this.y=y;
this.status=islight;
}
public void setlight(boolean sta) { //对外接口更改灯的状态
this.status=sta;
}
}
lamp类:
package traffic;
public class lamp implements Runnable {
light opposite, now; //相互匹配的两个灯
int greentime; //绿灯亮的时间
int name; //编组
boolean status; //状态
static Object lock = new Object();
public lamp(light l0, light l2,int gt, boolean st, int name) {
now = l0;
opposite = l2;
status = st;
greentime = gt;
this.name = name;
lightstatues();
}
public void change() {
this.status = !(this.status);
lightstatues();