티스토리 뷰

JAVA

MultiThread 멀티스레드

JSvsJS 2018. 12. 18. 22:46

멀티 스레드(Multi Thread)란?

- 우리가 흔히 사용하는 프로그램을 구현하기 위해서 논리적으로 분리된 하나의 메모리 공간이 필요하다. 이때 이 공간을 점유하는 하나의 객체가 프로세스 이다. 이때, 프로세스는 싱글 스레드 또는 멀티 스레드로 프로그램을 구현한다

- 싱글 스레드는 순차적으로 프로그램 처리할 수 있는 반면에, 멀티 스레드는 대용량 프로그램 목적으로 많이 쓰인다.

- 이 포스팅에서는 Java로 멀티스레드 구현하는 방식을 소개한다.



1) Worker : Task(일) 처리하기 위한 스레드 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.util.concurrent.LinkedBlockingQueue;
public class Worker extends Thread implements WorkerListener {
    
    private LinkedBlockingQueue queue;
    
    public void run() {
        
        Runnable task;

        while (true) {
            
            synchronized (queue) {
            
                while (queue.isEmpty()) {  
            
                    try {
                    
                        queue.wait(); // 요청이 올때까지 대기
                
                    } catch (InterruptedException e) {
                        System.out.println("InterruptedException : " + e.getMessage());
                    }
                    
                }
                
                task = (Runnable) queue.poll();
            }
    
            try {
                
                task.run();
                
            } catch (RuntimeException e) {
                System.out.println("RuntimeException : " + e.getMessage());
            }
        }
    }
    @Override
    public void register(LinkedBlockingQueue queue) {
        // TODO Auto-generated method stub
        this.queue = queue;
    }
}
cs


1
2
3
4
5
6
import java.util.concurrent.LinkedBlockingQueue;
 
public interface WorkerListener {    
    void register(LinkedBlockingQueue queue);
}
 
cs


2) ThreadPool : Worker(일꾼)을 생성하기 위한 pool 정보

  가. 필요한 일꾼을 인스턴스화 해서 멀티스레드 생성

  나. Timer로 실시간로 일꾼들 상태로 확인

  다. 일꾼들이 생성된 이후에는 자기가 어떤일을 해야하는지 지정 : 20라인


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
import java.util.concurrent.LinkedBlockingQueue;
import java.util.Timer;
import java.util.TimerTask;
 
public class ThreadPool  {
    
    private final int nThreads;
    private final Worker[] workers;
    private final LinkedBlockingQueue taskQueue;
 
    public ThreadPool (int nThreads) {
        this.nThreads = nThreads;
        taskQueue = new LinkedBlockingQueue();
        workers = new Worker[nThreads];
 
        for (int i = 0; i < nThreads; i++) {
            workers[i] = new Worker();
            workers[i].start();
            workers[i].register(taskQueue);
        }
        Timer();
    }
 
    public void execute(Runnable task) {        
        
        synchronized (taskQueue) {
            taskQueue.add(task);
            taskQueue.notify();
        }
    }
 
       
    private void Timer() {
        Timer timer = new Timer();
        
        timer.schedule(new TimerTask() {
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
                 for (int i = 0; i < nThreads; i++) {
                        System.out.println(workers[i].getState());
                 }
                
            }
            
        }, 10001000);
        
    }
}
cs


3)  Task : 실제 작업대상물


1
2
3
4
5
6
7
8
9
10
11
12
13
 
public class Task implements Runnable {
 
    private int num;
 
    public Task(int n) {
        num = n;
    }
 
    public void run() {
        System.out.println("Task " + num + " is running.");        
    }
}
cs


4) 테스트 

 가. 스레드 풀 생성

 나. TASK 생성

 다. 스레드 풀 에게 TASK작업 수행 요청

 라. 내부적으로 스레드들이 Queue polling 작업

1
2
3
4
5
6
7
8
9
10
11
12
 
public class Main {
 
    public static void main(String[] args) {
        ThreadPool pool = new ThreadPool(7);
 
        for (int i = 0; i < 5; i++) {
            Task task = new Task(i);
            pool.execute(task);
        }
    }
}
cs


멀티스레드 Core 핵심은 위와 같으며, 설계시에는 퍼블리셔, 서브스크라이버 등의 브로커를 이용해 아키텍처 화.

'JAVA' 카테고리의 다른 글

Clone() 클론 함수.  (0) 2018.12.26
ThreadLocal 은 언제써야할까??  (0) 2018.12.20
Model-View-Controller(MVC) Pattern  (0) 2018.12.16
이벤트버스 패턴  (0) 2018.12.07
브로커 패턴  (0) 2018.12.03
댓글