可以通过使用线程和锁机制来实现。下面是一个简单的示例:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TrafficSignal {
private final Lock lock = new ReentrantLock();
private final Condition greenLight = lock.newCondition();
private final Condition yellowLight = lock.newCondition();
private final Condition redLight = lock.newCondition();
private Signal currentSignal = Signal.GREEN;
public void changeToGreen() {
lock.lock();
try {
while (currentSignal != Signal.YELLOW) {
greenLight.await();
}
currentSignal = Signal.GREEN;
System.out.println("Green light is on.");
yellowLight.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void changeToYellow() {
lock.lock();
try {
while (currentSignal != Signal.RED) {
yellowLight.await();
}
currentSignal = Signal.YELLOW;
System.out.println("Yellow light is on.");
redLight.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void changeToRed() {
lock.lock();
try {
while (currentSignal != Signal.GREEN) {
redLight.await();
}
currentSignal = Signal.RED;
System.out.println("Red light is on.");
greenLight.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private enum Signal {
GREEN,
YELLOW,
RED
}
}
在上述示例中,TrafficSignal类使用了ReentrantLock和Condition来实现多线程控制。通过lock和unlock方法来获取和释放锁,使用await和signal方法来实现线程的等待和唤醒。
使用示例:
public class Main {
public static void main(String[] args) {
TrafficSignal trafficSignal = new TrafficSignal();
Thread greenThread = new Thread(() -> {
while (true) {
trafficSignal.changeToGreen();
try {
Thread.sleep(5000); // 绿灯持续5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread yellowThread = new Thread(() -> {
while (true) {
trafficSignal.changeToYellow();
try {
Thread.sleep(2000); // 黄灯持续2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread redThread = new Thread(() -> {
while (true) {
trafficSignal.changeToRed();
try {
Thread.sleep(3000); // 红灯持续3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
greenThread.start();
yellowThread.start();
redThread.start();
}
}
在上述示例中,创建了三个线程分别控制交通信号的绿灯、黄灯和红灯。每个线程通过调用TrafficSignal类中的相应方法来改变交通信号的状态,并且设置了不同的持续时间。
这个多线程实现可以用于模拟交通信号灯的运行,可以根据实际需求进行扩展和优化。
腾讯云相关产品和产品介绍链接地址:
领取专属 10元无门槛券
手把手带您无忧上云