[코드스쿼드 코코아 과정_자바] 실행중인 반복문을 종료하고 다른 스레드로 접근하려면?

Kyu·2020년 11월 19일
0

문제

  • 메인메소드에서 사용자의 선택에 따라 달력과 시계를 출력할 수 있는 로직이 있다.
  • 시계에는Thread.sleep()에 의해서 1초 단위로 시계를 출력하는 반복문이 있다.
  • 시계를 선택하면 무한 루프이기 때문에 도중에 스캐너 쓰레드가 실행되도록 설정하였다.
  • 무한 루프 도중에 스캐너에 아무거나 입력하면 메인메소드의 시계가 종료가 되고 스캐너에 있는 로직에 따라 다시 메인메소드가 실행이된다.

해결해야 할 것

  • 메인메소드를 쓰레드 형태로..즉 예외를 날려주는 형태로 바꿀 것
  • 쓰레드 클래스의 join() 메소드는 다른 스레드가 종료될때까지 기다려준다. 이걸 이용할 수 있도록 학습.

1. join() 의미, 사용법

join을 쓰면 해당되는 쓰레드가 종료될때까지 join을 쓴 쓰레드를 일시정지 시킨다. 예를 들어서, clock이 종료될때까지 main을 정지시키고 싶다면 다음과 같이 사용할 수 있다.

public class Main {
	public static void main(String[] args) {
		ThreadClock c = new ThreadClock(); //c라는 clock쓰레드를 생성한다.
  	    	c.start(); // c를 실행시킨다.
            
            try { //Exception을 Throw하기 위해서 try catch 구문을 만든다
            	c.join(); //c가 종료될때까지 main을 일시정지시킨다.
                } catch (InterruptedException e) {
                e.printStackTrace();
                }
                /*👉참고
                printStackTrace () 메소드는 예외 및 오류를 처리하는 데 사용되는
                * 도구이다. 예외가 발생한 줄 번호 및 클래스 이름과 같은 기타 세부 정보
                * 등을 print하는 클래스 메소드이다.
                */
         	
            System.out.println("Clock이 종료되고 메인쓰레드가 실행됩니다");
     }
 }
                

2. 문제로의 접근

join()의 사용법에 의하면 일단 첫번째로 clock 클래스를 쓰레드 형태로 바꾸어야한다. 그리고 메인메소드에서 clock을 불러오고 join()을 이용해서 메인을 중지시키는 형식으로 해야한다. clock 의 while 문 안에 어떤 조건문을 주어서 정지시키도록 하고, 그 조건이 되었을 때 정지가 되면 메인스레드가 실행이 되면서 다시 처음으로 돌아간다.

3. 해결되었지만 다른 문제 발생

scanner를 닫고 다시 열면 안열린다.

clock 안에 static boolean으로 exitClock이라는 변수를 만들어 주었다. while 조건문 안에 exitClock이 true일때 작동하게 했다. ThreadScanner 쓰레드에 아무거나 입력하면 exitClock가 false가 되도록 선언했다.

메인쓰레드에서는 1번 예시에서 적은 것처럼 clock을 start()하고 try catch문에 join()을 사용해서 clock이 종료될때까지 기다리도록 한 뒤에, try catch 문이 끝나면, 시계와 달력을 출력할 수 있는 메소드로 돌아가도록 만들었다.

문제는 다시 실행된 메소드에서 달력과 시계를 선택하는 곳에서 달력을 선택하면 정상작동하지만 clock을 실행해도 아무 반응이 없다. 내 추측으로는 clock메소드가 이미 "종료" 되어졌기 때문에 다시 실행이 안되는 듯하다. 왜냐하면 이전에 Scanner를 열고 닫고 열고 닫고를 반복하면 반복문을 구현한적이 있었는데 작동하지 않았었다. 그때 당시에, 검색으로 알게 된건 무조건 한번 연거가지고 사용해야한다고 했었다. 똑같은 이치로 여기서의 clock도 마찬가지가 아닌가 싶다.

4. 음 어떻게 해야하지?

해결법을 찾지못해서 다른 팀원들의 코드를 참고해보기로 했다. B님이 순서에서 제일 위에 있길래 처음으로 확인해봤는데 바로 Time과 Timer라는 힌트를 얻을 수 있었다. 개념을 익히고 내 코드에 적용시켜봤지만 여전히 똑같이 clock이 재실행 되지 않는다..음.. ThreadScanner가 계속되어서 작동하고 있어서인거 같은데..스캐너가 지금 두개 작동하고있어서 뭔가 문제가 있는 거 같다

profile
TIL 남기는 공간입니다

0개의 댓글