티스토리 뷰
멀티 스레드(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()); } } }, 1000, 1000); } } | 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 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- JSP JAVA
- data.map
- 카드사용알림서비스
- 이벤트버스패턴
- jsp 자바클래스 넣는법
- jsp내 자바넣기
- 계층화패턴
- 마스터 슬레이드 패턴
- 마스터 슬레이드
- 데이터시각화
- JSP 자바 사용법
- JSP JAVA 변수 선언
- 자바 클론
- 클라이언트서버아키텍처
- HTTPS
- 아키텍처패턴
- 퍼블릿블록체인
- 이더리움
- JSP JAVA코드 넣기
- <%%>
- 아키텍처
- 디자인패턴
- 자바 객체복사
- SSL
- 클라이언트서버모델
- jsp
- 스레드로컬
- 프라이빗블록체인
- 소프트웨어디자인
- josn object
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함