수정 전 코드
class Car extends Thread {
private Road road; // 공유자원인 도로 객체
public Car(Road r,String a) {
road = r;
super(name) // 객체로부터 받아온 이름에서 생성자는 생성자 주기에만 동작한다. 그래서 멤버변수에 값을 따로 저장해준다 > 이건 어느 경우에..
}
public void run() {
for(int i=0;i<3;i++){
road.runcar(i); }
}
}
class Bicycle extends Thread {
Road road; // 공유자원인 도로 객체
public Bicycle(Road r,string b){
road = r;
b=super(name);
}
public void run() {
for(int i=0;i<3;i++){
road.runBicycle(i); }
}
}
class Human extends Thread {
Road road; // 공유자원인 도로 객체
public Human(Road r,String c){
road = r;
c=super(name);
}
public void run() {
for(int i=0;i<3;i++){
road.walkHuman(i); }
}
}
class Road {
int signal = 1; // 자동차 신호
int signal = 2; // 자전거 신호
int signal = 3; // 보행자 신호
public synchronized void runCar() {
while(signal!=1) { // 자동차의 신호가 1번이 아닐 때
try{
wait(); // 자동차는 기다린다.
} catch (InterruptedException e) { }
}
System.out.println(a+ "가 주행한다"); // 자동차 신호가 1번이 맞으므로 차가 주행한다. 근데 왜 a값이 안넘어왔지?
// 자동차 신호가 자신의 일을 끝내기 전에 나머지 객체가 일할 수 있도록 신호 바꿔주기
if(signal==2 && signal==3){
notifyAll();
} else { }
}
public synchronized void runBicycle() {
while(signal!=2){
try{
wait(); //자전거는 기다린다
} catch (InterruptedException e) { }
}
System.out.println( b + "가 달린다"); // 자전거 신호가 2번이 맞으므로 자전거가 달린다.
// 자전거 신호가 자신의 일을 끝내기 전에 나머지 객체가 일할 수 있도록 신호 바꿔주기
if(signal==1 && signal==3){
notifyAll();
} else { }
}
public synchronized void walkHuman() {
while(signal!=3){
try{
wait(); // 보행자는 기다린다
} catch(InterruptedException e) { }
}
System.out.println( c + "가 길을 건넌다");
// 보행자 신호가 자신의 일을 끝내기 전에 나머지 객체가 일할 수 있도록 신호 바꿔주기
if(signal==1 && signal==2){
notifyAll();
} else { }
}
}
class ThreeSignal {
public static void main(String[] args) {
Road rd = new Road(); // 공유자원인 도로 객체
Car car = new Car("자동차",rd); // 자동차 쓰레드 객체 , 공유자원인 도로 객체 공유
Bicycle bc = new Bicycle("자전거",rd); // 자전거 쓰레드 객체
Human hm = new Human("보행자",rd); // 보행자 쓰레드 객체
car.start();
bc.start();
hm.start();
}
}
수정 후 코드
class Car extends Thread {
private Road road; // 공유자원인 도로 객체
public Car(Road r) {
road = r;
}
public void run() {
for(int i=0;i<3;i++){
road.drive();
}
}
}
class Bike extends Thread {
Road road; // 공유자원인 도로 객체
public Bike(Road r){
road = r;
}
public void run() {
for(int i=0;i<3;i++){
road.biking();
}
}
}
class Man extends Thread {
Road road; // 공유자원인 도로 객체
public Man(Road r){
road = r;
}
public void run() {
for(int i=0;i<3;i++){
road.walk();
}
}
}
class Road {
private String signal = "green";
public synchronized void drive() {
while(signal!="green") { // 자동차의 신호가 green이 아닐 때
try{
wait(); // 자동차는 기다린다.
} catch (InterruptedException e) { }
}
System.out.println("차가 주행한다");
signal = "yellow"; // 자전거 신호 바꿔주기
notifyAll();
}
public synchronized void biking() {
while(signal!="yellow"){
try{
wait(); //자전거는 기다린다
} catch (InterruptedException e) { }
}
System.out.println("자전거가 달린다"); // 자전거 신호가 yellow가 맞으므로 자전거가 달린다.
// 자전거 신호가 자신의 일을 끝내기 전에 나머지 객체가 일할 수 있도록 신호 바꿔주기
signal = "red";
notifyAll();
}
public synchronized void walk() {
while(signal!="red"){
try{
wait(); // 보행자는 기다린다
} catch(InterruptedException e) { }
}
System.out.println("보행자가 길을 건넌다");
signal = "green"; // 자동차 신호로 바꿔주기
notifyAll();
}
}
class ThreeSignal2 {
public static void main(String[] args) {
Road rd = new Road(); // 공유자원인 도로 객체
Car car = new Car(rd); // 자동차 쓰레드 객체 , 공유자원인 도로 객체 공유
Bike bike = new Bike(rd); // 자전거 쓰레드 객체
Man man = new Man(rd); // 보행자 쓰레드 객체
car.start();
bike.start();
man.start();
}
}
놓쳤던 부분, 헷갈렸던 부분