• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

쓰레드 순서

23.04.17 16:29 작성 조회수 415

0

 쓰레드 첫번째 강의 내용중,

  1. 직원청소 (Thread 클래스이용)

  2. 사장청소 의 순서대로 실행하면 잘 섞여서 청소를 하는데

  1. 사장청소

  2. 직원청소 (Thread 클래스이용) 의 순서대로 하면 사이좋게 나누어서 일을 안하고 사장청소 끝난다음에 직원이 청소를 합니다.

두번째로 해야되는 이유가 궁금하구요.

만약 사장청소도 쓰레드로 만들어서

  1. 사장청소

  2. 직원청소로 하면 안되나요?

     

감사합니다. ^^

 

답변 2

·

답변을 작성해보세요.

1

※ 본 내용은 과거에 등록된 유사한 질문의 답변에서 일부 수정하여 작성하였습니다.
👉 https://www.inflearn.com/questions/823440

안녕하세요?
사장 청소 > 직원 청소의 순서로 했을 때 동일한 코드를 여러 번 돌렸음에도 불구하고 순서가 섞이지 않는다면 start() 가 아닌 run() 메소드를 직접 호출하신 것은 아닌지 확인이 필요합니다. 또는 코드를 잘 적어주셨다면 혹시 모르니 임의의 시간만큼 대기하는 Thread.sleep(ms) 를 넣어보시면 섞인 결과를 확인하실 수도 있어요.

대기하는 부분은 작성하신 코드에서 아래와 같이 반복문 내에 각각 수정해주시면 되며, 이는 사장 또는 직원이 하나의 방을 청소할 때마다 500 ms, 즉 0.5 초씩 대기하게 됩니다. 주석 처리된 부분을 참고해주세요.

...
public static void cleanByBoss() {
    System.out.println("-- 사장 청소 시작 --");
    for (int i = 1; i <= 10; i += 2) {
        System.out.println("(사장) " + i + "번방 청소 중");

//////////// 코드 추가된 부분 ///////////////
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
//////////// 코드 추가된 부분 ///////////////

    }
    System.out.println("-- 사장 청소 끝 --");
}
public class CleanThread extends Thread {
    public void run() {
        System.out.println("-- 직원 청소 시작 (Thread) --");
        for (int i = 2; i <= 10; i += 2) {
            System.out.println("(직원) " + i + "번방 청소 중 (Thread)");

//////////// 코드 추가된 부분 ///////////////
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
//////////// 코드 추가된 부분 ///////////////

        }
        System.out.println("-- 직원 청소 끝 (Thread) --");
    }
}

실행해보시면 이번에는 뒤섞인 결과를 확인하실 수 있을 거에요 😊
그럼에도 불구하고 잘 되지 않는다면 작성하신 코드 전체와 함께 다시 질문을 남겨주시면 도움드리겠습니다.
감사합니다.

smhanphd님의 프로필

smhanphd

질문자

2023.04.18

앗 죄송합니다. 질문이 명확하지 못했군요.

CleanThread cleanThread = new CleanThread();
cleanThread.start(); //직원청소
cleanByBoss(); // 사장 청소

위의순서대로 하면 잘 섞이는데 아래처럼 순서만 바꾸면 안섞입니다.

cleanByBoss(); // 사장 청소
CleanThread cleanThread = new CleanThread();
cleanThread.start(); //직원청소

논리적으로는 문제가 없는것 같은데 뭔가 놓치고 있다는 생각이 듭니다.

 

 

 

아!
죄송합니다. 제가 질문을 꼼꼼히 확인하지 못하고 답변을 드렸네요 😅

cleanByBoss(); 를 cleanThread.start(); 위로 옮기게 되면 사장 청소 부분이 모두 끝나고 나서 직원 청소가 시작되는 것이 맞습니다. cleanByBoss(); 는 별도의 쓰레드를 만들어서 작업하는게 아니기 때문에 메소드의 모든 동작이 끝나고 나야 다음 문장이 실행됩니다. 일반적인 코드의 실행 순서가 위에서 아래로 순차적으로 실행되는 것과 동일하죠. 그래서 cleanByBoss(); 가 모두 끝나기 전에는 cleanThread.start(); 명령이 실행되지 않습니다.

반면에 강의에서처럼 cleanThread.start(); 가 먼저 실행된다면 이는 별도의 쓰레드를 생성하여 실행되기 때문에 모든 동작이 완료될 때까지 기다리지 않고 바로 밑에 있는 cleanByBoss(); 명령이 이어서 실행됩니다. 그러다 보니 사장 청소직원 청소가 함께 실행되는 것이죠.

처음 질문의 마지막으로 적어주신 것처럼 사장 청소도 쓰레드로 만들게 되면 순서 상관 없이 둘 다 함께 수행됩니다. 아마 조금 뒷쪽을 공부하시면 이 예제도 만나게 될거에요 😊

이번 답변은 제가 올바로 드렸길 바랍니다.
감사합니다.

smhanphd님의 프로필

smhanphd

질문자

2023.04.20

아 감사합니다.

쓰레드 라는 놈이 생성이 되면 그 이후에 존재하는 "평범한 일꾼" 혹은 다른 쓰레드들과 자원을 스스로 알아서 나누어서 일을 하는 습성이 있는 군요.

근데 문득 드는 생각은 강의에서도 말씀하신바와 같이 브라우저등 서버에서 돌아가는 것이 아니라면 일상적으로는 어느부분에 응용이 가능할지 의문이 드네요. 쓰레드는 서버용 프로그램을 위한 기능이지 않을까 조심스럽게 예측해 봅니다. ^^

답변되었습니다. 감사합니다.

0

혹시나 제 댓글의 답글로 작성해서 질문자분께 메일 알림이 가지 않았을까봐 답변을 다시 작성합니다. 새로운 답변 확인 부탁드려요 😊