Thread Counter 구현 - #2

김병우·2024년 3월 11일
0

Java-Thread

목록 보기
2/5

전편에는 Thread에 대한 개요를 공부했었고 이번 편에서는 Java를 통해서 Thread를 공부해나가 볼까 합니다. 공부 중이기 때문에 틀린 부분있으면 지적 꼭 좀 부탁드립니다. 이 글 또한 도움이 됐으면 좋겠습니다😀
제가 실습한 코드는 혹시 몰라 올려둡니다. https://github.com/helloJosh/nhn-homework-thread-study

1. Thread Counter - 2가지 Main 함수

public class RunnableCounter implements Runnable{
	String name;
    int count;
    int maxCount;
    public RunnableCounter(String name, int maxCount){
    	// 생성자 중략
    }
    @Override
    public void run(){
    	while(count < maxCount){
        	try{
            	Thread.sleep(1000);
                count++;
                System.out.println(name +":"+count);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

Counter Class 구현 코드

public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        RunnableCounter counter1 = new RunnableCounter("counter1", 10);
        RunnableCounter counter2 = new RunnableCounter("counter2", 10);

        System.out.println("start :" + now);

        counter1.run();
        counter2.run();
        
        System.out.println("end :" + now);
    }
public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        RunnableCounter counter1 = new RunnableCounter("counter1", 10);
        RunnableCounter counter2 = new RunnableCounter("counter2", 10);
		Thread thread1 = new Thread(counter1);
        Thread thread2 = new Thread(counter2);

        System.out.println("start :" + now);

        thread1.start();
        thread2.start();
        
        System.out.println("end :" + now);
    }

무슨 차이일까

  • 첫번째 메인코드는 Main 쓰레드가 계속 돌면서 Start+시간을 찍고 Counter를 찍고 마지막에 End+시간을 찍는다.
  • 두번째 코드는 Main이 아닌 쓰레드가 돌아 Start, End를 찍고 Counter가 찍힌다.
  • 즉, Start() 함수는 Linux의 Fork와 같이 쓰레드를 복사하고 할당해준다.

  • run()의 경우 CallStack에서 Thread Main만 돌고 있는 것을 알 수 있다.

  • start()의 경우 CallStack에서 Main이 아닌 다른 Thread-0 이라는 것을 볼 수 있다.

2. Thread 할당

public static void main(String[] args) {
        LocalTime now = LocalTime.now();
        RunnableCounter counter1 = new RunnableCounter("counter1", 10);
        RunnableCounter counter2 = new RunnableCounter("counter2", 10);
        Thread thread1 = new Thread(counter1);
        Thread thread2 = new Thread(counter2);

        System.out.println("start :" + now);

        thread1.start();
        thread2.start();
        
        while(thread1.isAlive() || thread2.isAlive())
            ;
        System.out.println("end :" + now);
    }
  • 위와 같이 Thread를 직접 할당할 수 있고 run()을 사용했던 Main코드와 똑같이 출력을 만들어 낼 수 있다.
profile
백엔드개발자

0개의 댓글