Java并发系列:使用线程的start、interrupt方法,实现交通红绿灯场景

/ JavaSE / 198浏览

首先我们知道:线程的启动方法为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
东西路:红灯停。
...