퀴즈 12번 질문있습니다.
퀴즈 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
== 상품 준비 끝 == 감사합니다.
자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?
1
145
2
static이 뭐였는지 기억이 안나요 ㅜㅜ
0
118
2
Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의
0
70
1
사고력 키우는 법이 어떤게 있나요?
0
93
2
getter setter
0
101
2
섹션9. 66 메소드 오버로딩 시 질문이 있습니다.
0
78
1
안녕하세요 갑자기 프로그램 에러가 떠서 안되네요
0
75
2
변수 이름짓는법
0
114
2
intelli J 실행오류
0
114
2
혹시 이건 수학적 사고가 부족한 걸까요?
0
152
2
영상이 재생이 안됩니다.
0
167
3
이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.
0
116
2
응용이 어렵습니다.
0
206
2
IntelliJ가 보이지 않습니다.
0
184
3
JDK 버전 문의
0
128
2
BlackBox 파일 내에서 메소드 정의
0
136
1
동기화
0
120
2
Iterator 문의
0
104
1
코드 순서 문의
0
141
1
클래스 메소드
0
149
2
Quiz_05 관련 질문드립니다 !
0
118
2
다운로드가 안됩니다
0
165
2
다형성
0
119
2
HashMap
0
80
2





