해결된 질문
작성
·
119
·
수정됨
1
퀴즈 12번에서 아래와 같이 코드를 작성했는데,
실행 결과가 계속 해도 순차적으로 나옵니다..
public static void main(String[] args) {
Runnable product1 = () -> {
for (int i = 1; i <= 5 ; i++) {
System.out.println("A 상품 준비 " + i + "/5");
}
System.out.println("-- A 상품 준비 완료 --");
};
Runnable product2 = () -> {
for (int i = 1; i <= 5 ; i++) {
System.out.println("B 상품 준비 " + i + "/5");
}
System.out.println("-- B 상품 준비 완료 --");
};
Thread ProductThread1 = new Thread(product1);
Thread ProductThread2 = new Thread(product2);
ProductThread1.start();
ProductThread2.start();
while(ProductThread1.isAlive() || ProductThread2.isAlive()){
}
/*try {
ProductThread1.join();
ProductThread2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}*/
Runnable packing = () -> {
System.out.println(" == 상품 준비 시작 == ");
for (int i = 1; i <= 5; i++) {
System.out.println("세트 상품 포장" + i + "/5");
}
System.out.println(" == 상품 준비 끝 == ");
};
Thread ProductPacking = new Thread(packing);
ProductPacking.start();
}
A실행이 끝나고 B로 넘어가는데,, 왜 그런걸까요.. 뭐가 문제일까요.. 강의와 똑같이 작성했는데..
A 상품 준비 1/5
A 상품 준비 2/5
A 상품 준비 3/5
A 상품 준비 4/5
A 상품 준비 5/5
-- A 상품 준비 완료 --
B 상품 준비 1/5
B 상품 준비 2/5
B 상품 준비 3/5
B 상품 준비 4/5
B 상품 준비 5/5
-- B 상품 준비 완료 --
== 상품 준비 시작 ==
세트 상품 포장1/5
세트 상품 포장2/5
세트 상품 포장3/5
세트 상품 포장4/5
세트 상품 포장5/5
== 상품 준비 끝 ==
이런 식으로 나오거나 A와 B의 순서만 바뀔 뿐 숫자가 ABABAAB 이런식으로 섞이지가 않습니다..
AAAAABBBBB 또는 BBBBBAAAAA이런식으로 나와요..
아니면 AAAAAB(A준비완료)BBBB 이런식으로도 안나옵니다.. 무조건 한 상품 5개 모두 실행완료 후 다음 상품 실행해요..
답변 1
0
안녕하세요?
다중 쓰레드의 동작이 너무 빨리 이루어지는 경우 질문주신 것처럼 동시에 실행되지 않고 순차적으로 실행되는 것처럼 보일 수 있습니다. 이런 경우에는 임의로 동작의 속도를 늦춰서 확인해보시면 좋은데요. 다음과 같이 for 반복문 속에 1초를 대기하는 코드를 추가해서 확인 부탁드리겠습니다 😊
(삽입해야 하는 코드)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
(삽입 위치 #1)
Runnable product1 = () -> {
for (int i = 1; i <= 5 ; i++) {
System.out.println("A 상품 준비 " + i + "/5");
// 아래에 추가
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("-- A 상품 준비 완료 --");
};
(삽입 위치 #2)
Runnable product2 = () -> {
for (int i = 1; i <= 5 ; i++) {
System.out.println("B 상품 준비 " + i + "/5");
// 아래에 추가
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("-- B 상품 준비 완료 --");
};
이렇게 하게 되면 아마 1초마다 A, B 가 동시에 상품을 준비하는 결과를 확인하실 수 있게 될거에요.
(실행 결과 예시)
A 상품 준비 1/5
B 상품 준비 1/5
A 상품 준비 2/5
B 상품 준비 2/5
B 상품 준비 3/5
A 상품 준비 3/5
B 상품 준비 4/5
A 상품 준비 4/5
B 상품 준비 5/5
A 상품 준비 5/5
-- B 상품 준비 완료 --
-- A 상품 준비 완료 --
== 상품 준비 시작 ==
세트 상품 포장1/5
세트 상품 포장2/5
세트 상품 포장3/5
세트 상품 포장4/5
세트 상품 포장5/5
== 상품 준비 끝 ==
감사합니다.
앗 다중스레드 동작이 빠르면 그렇게 보일 수 있군요..! 감사합니다~!!ㅎㅎ