首先我们知道:线程的启动方法为start()
;终止方法为interrupt()
。
由于交通红绿灯是一个循环的过程,可以利用线程的这两个方法,在一个无限循环中,模拟实现交通红绿灯场景。
创建线程类
线程类代表路灯,所以需要一个路灯时长的sh属性:private int second = 10;
还需要实现一个红绿灯交替运行的方法。由于红绿灯是永恒运转的,所以这个方法需要无限循环来实现红绿灯的交替运行:
/**
* 线程实现交通红绿灯场景。
* @auther: Zealon
*/
public class UseInterrupt implements Runnable{
//路灯时长(秒)
private int second = 10;
public int getSecond() {
return second;
}
public void setSecond(int second) {
this.second = second;
}
public UseInterrupt(int second){
this.second = second;
}
public synchronized void redGreenLight() throws InterruptedException {
while (true){
for(int i=second;i>=0;i--) {
Thread.sleep(1000);
if(i==0){
System.out.println(Thread.currentThread().getName()+":红灯停。");
/**
* 当前路线红灯后,开启另一条路线的绿灯。
* 这里创建一个线程,根据当前的路名称,判断后续绿灯线程并启动。
*/
Runnable runnable;
Thread t;
if(Thread.currentThread().getName().equals("南北路")){
runnable = new UseInterrupt(3);
t = new Thread(runnable);
t.setName("东西路");
}else{
runnable = new UseInterrupt(5);
t = new Thread(runnable);
t.setName("南北路");
}
t.start();
//停止当前路灯线程
Thread.currentThread().interrupt();
//打印当前运行线程数
ThreadGroup group = Thread.currentThread().getThreadGroup();
System.out.println("当前活动线程数:"+group.activeCount());
}else {
System.out.println(Thread.currentThread().getName() + ":绿灯,倒计时" + i + "s");
}
}
}
}
@Override
public void run() {
try {
redGreenLight();
} catch (InterruptedException e) {
}
}
public static void main(String[] args) {
UseInterrupt nanbei = new UseInterrupt(5);
Thread t1 = new Thread(nanbei);
t1.setName("南北路");
t1.start();
}
}
测试运行
这里首先需要一个main方法来启动任意一路的交通灯对象,先启动了一个南北路的对象,设置了时长为5秒,然后启动线程开始执行,然后在线程内红绿灯方法里,进行倒计时判断,如果到0秒时,设置为红灯,然后开启下个路灯线程同时终止当前路灯线程,保证了交替运行。
测试结果:
南北路:绿灯,倒计时5s
南北路:绿灯,倒计时4s
南北路:绿灯,倒计时3s
南北路:绿灯,倒计时2s
南北路:绿灯,倒计时1s
南北路:红灯停。
当前活动线程数:4
东西路:绿灯,倒计时3s
东西路:绿灯,倒计时2s
东西路:绿灯,倒计时1s
东西路:红灯停。
当前活动线程数:4
南北路:绿灯,倒计时5s
南北路:绿灯,倒计时4s
南北路:绿灯,倒计时3s
南北路:绿灯,倒计时2s
南北路:绿灯,倒计时1s
南北路:红灯停。
当前活动线程数:4
东西路:绿灯,倒计时3s
东西路:绿灯,倒计时2s
东西路:绿灯,倒计时1s
东西路:红灯停。
...
作者: Zealon
崇尚简单,一切简单自然的事物都是美好的。