inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

나도코딩의 자바 기본편 - 풀코스 (20시간)

퀴즈 12번 질문있습니다.

해결된 질문

168

hyejung9904

작성한 질문수 3

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개 모두 실행완료 후 다음 상품 실행해요..

 

 

java 객체지향

답변 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
 == 상품 준비 끝 == 

감사합니다.

0

hyejung9904

앗 다중스레드 동작이 빠르면 그렇게 보일 수 있군요..! 감사합니다~!!ㅎㅎ

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

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