본문 바로가기
Programming/JAVA

[Java] Multi Thread 처리

by 코딩의성지 2021. 8. 30.

하이 오랜만에 글을 쓴다.

 

1.Thread란

 

오늘은 Java의 Thread 개념에 대해 다루려고 한다. 

보통 대부분의 네트워크 통신을 거치는 프로그램은 멀티 스레드 환경에서 구현이 되어야한다. 

간단하게 말해서 여러 클라이언트에서 들어오는 메시지를 동시에 처리할 수 있어야한다는 말이다.

 

Java에서 특정한 Task를 돌릴때 동시에 여러 일을 처리하게 해야할 때가 있는데 이때 그 일을 수행할 녀석을 만든다. 이게 바로 Thread 이다. 이 Thread는 사용하는 Machine의 cpu 자원을 활용하여 할당되고 업무가 수행된다.

 

기본적인 내용이지만 같은 프로그램안에서 각각의 스레드는 서로가 생성한 객체를 공유하여 사용할 수 있다는 점도 알아두자. 뒤에 다룰 내용이지만 이 객체에 대한 동시성 , 동기화 문제를 꼭 해결해줘야할 때가 있다.

 

 

2. Thread 구현 방법

 

Java에서 Thread를 구현하는 방법은 두가지가 있다. 하나는 Thread 클래스를 이용하는 것이고 하나는 Runnable 인터페이스를 이용하는 것이다.

 

1) Thread Class

먼저 Thread Class를 이용하는 방법은 아래와 같다. 

 

(a) Thread Class를 상속 받은 Class를 하나 만듦

(b) run() 메서드를 overriding하여 수행할 일을 코딩해준다.

(c) main thread 에서 a 단계에서 만든 Class의 start() 메서드를 호출한다.

 

여기서 start() 는 run() 안에 정의된 일을 main 스레드가 아닌 별도로 만들어진 thread에서 처리한다는 것이니 꼭 해줘야한다.

 

간단하게 예시를 하나 들어서 코드로 구현해보겠다.

public class ThreadEx {
    public static void main(String[] args) {
        Thread t = new MyThread();
        t.start();

        int cnt = 1;
        int sum = 0;
        while(cnt<=10) {
            sum = sum + cnt;
            System.out.println( "+"+cnt+"=" + sum);
            cnt++;
        }
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
        int cnt = 1;
        int multipl = 1;
        while(cnt<=10) {
            multipl = multipl * cnt;
            System.out.println( "x"+cnt+"=" + multipl);
            cnt++;
        }

    }
}

코드를 간단하게 설명 드리면 main 메서드에서 1부터 10까지 곱하는 별도의 Thread를 하나 돌리고 main 메서드에서는 1부터 10까지 더하는 로직을 또 수행한다. 이렇게 돌리면 아래와 같은 결과가 나온다.

위의 결과 처럼 main 스레드와 별도로 수행된 스레드는 각자 알아서 일을 처리하는 것을 볼 수 가 있다. 그리고 위의 결과처럼 뒤죽박죽 로직이 돌아가는데 이처럼 서로의 일이 어떻게 되든 신경쓰지 않고 일을 한다고 생각하면 된다.

 

2) Runnable Interface

다음은 Runnable 인터페이스를 이용하는 방법이다. 

 

(a) Runnable Interface를 구현하는 Class를 하나 만듦

(b) run() 메서드를 overriding하여 수행할 일을 코딩해준다.

(c) 구현된 인터페이스를 스레드 생성시 생성자 파라미터로 넣어준다.

(d) main thread 에서 a 단계에서 만든 Class의 start() 메서드를 호출한다.

 

위에서  보여준 코드와 동일하게 결과가 나오도록 코드로 구현해보면 아래와 같다.

public class RunnableEx {
    public static void main(String args[]) {
        Runnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start();

        int cnt = 1;
        int sum = 0;
        while(cnt<=10) {
            sum = sum + cnt;
            System.out.println( "+"+cnt+"=" + sum);
            cnt++;
        }
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        int cnt = 1;
        int multipl = 1;
        while(cnt<=10) {
            multipl = multipl * cnt;
            System.out.println( "x"+cnt+"=" + multipl);
            cnt++;
        }

    }
}

이렇게 기본적으로 멀티 스레딩을 구현하는 방법을 정리해 보았는데, 만약에 자원을 동시에 사용하거나 순서의 제어가 필요한 경우에는 동시성 처리를 해줘야할 필요가 있다. 스레드의 동시성 처리에 관한 문제는 다음 포스팅에서 다루도록하겠다.

반응형

댓글