• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

퀴즈 12번 질문있습니다.

24.01.03 13:55 작성 24.01.03 13:58 수정 조회수 83

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

감사합니다.

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