해결된 질문
작성
·
232
0
package chap_12;
import chap_12.clean.Room;
public class _05_Synchronization {
public static void main(String[] args) {
Room room = new Room();
Runnable cleaner1 = () -> {
System.out.println("-- 직원1 청소 시작 --");
for (int i = 1; i <= 5; i++) {
room.clean("직원1");
}
System.out.println("직원1 청소 끝!");
};
Runnable cleaner2 = () -> {
System.out.println("-- 직원2 청소 시작 --");
for (int i = 1; i <= 5; i++) {
room.clean("직원2");
}
System.out.println("직원2 청소 끝!");
};
Thread cleanerThread1 = new Thread(cleaner1);
Thread cleanerThread2 = new Thread(cleaner2);
cleanerThread1.start();
cleanerThread2.start();
}
}
package chap_12.clean;
public class Room {
public int number = 1;
synchronized public void clean(String name) {
System.out.println(name + " : " + number + "번방 청소 중!");
number++;
}
}
Room class 에서 synchronized 를 빼면 실행할때마다 직원 1, 2 가 섞여서 나오는데 동기화를 넣어주면
아무리 여러번 실행하더라도
-- 직원1 청소 시작 --
-- 직원2 청소 시작 --
직원1 : 1번방 청소 중!
직원1 : 2번방 청소 중!
직원1 : 3번방 청소 중!
직원1 : 4번방 청소 중!
직원1 : 5번방 청소 중!
직원1 청소 끝!
직원2 : 6번방 청소 중!
직원2 : 7번방 청소 중!
직원2 : 8번방 청소 중!
직원2 : 9번방 청소 중!
직원2 : 10번방 청소 중!
직원2 청소 끝!
의 결과 밖에 나오지 않습니다. 제 코드에서 문제 되는 부분이 있을가요? ㅠㅠ
답변 1
0
안녕하세요?
쓰레드는 강의에서 사용한 것처럼 아주 빠르게 실행되는 예제인 경우 종종 이런 결과를 볼 수도 있습니다. for 문 내에서 임의로 어느 정도 시간이 걸리는 것을 흉내내기 위해 Thread.sleep(200); 정도를 넣어서 방 청소를 할 때마다 0.2 초씩 소요되도록 하면 직원1, 직원2가 섞여서 출력되는 것을 확인하실 수 있을 거예요 🤗
질문으로 적어주신 코드에 앞에서 설명드린 코드(주석 부분) 를 추가하였습니다. 직원이 섞여서 청소를 하되, 동시에 2개 방이 중복해서 청소되는 일이 없는지 확인해주시면 됩니다.
package chap_12;
import chap_12.clean.Room;
public class _05_Synchronization {
public static void main(String[] args) {
Room room = new Room();
Runnable cleaner1 = () -> {
System.out.println("-- 직원1 청소 시작 --");
for (int i = 1; i <= 5; i++) {
room.clean("직원1");
// 코드 추가 시작부분
try {
Thread.sleep(200); // 청소하는데 소요되는 시간 0.2초 추가
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 코드 추가 끝 부분
}
System.out.println("직원1 청소 끝!");
};
Runnable cleaner2 = () -> {
System.out.println("-- 직원2 청소 시작 --");
for (int i = 1; i <= 5; i++) {
room.clean("직원2");
// 코드 추가 시작부분
try {
Thread.sleep(200); // 청소하는데 소요되는 시간 0.2초 추가
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 코드 추가 끝 부분
}
System.out.println("직원2 청소 끝!");
};
Thread cleanerThread1 = new Thread(cleaner1);
Thread cleanerThread2 = new Thread(cleaner2);
cleanerThread1.start();
cleanerThread2.start();
}
}
이해에 도움되시길 바라겠습니다.
감사합니다 😊