본문 바로가기
Java/study

멀티스레드

by avvin 2019. 4. 16.

프로세스

실행중인 하나의 애플리케이션


멀티 프로세스

애플리케이션 단위의 멀티태스킹


스레드

어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 



멀티스레드


애플리케이션 내부에서의 멀티태스킹

한 프로세스 내에서 멀티태스킹 (ex.채팅앱에서 채팅하면서 파일 전송) 하려면 멀티스레드 필요

하나의 스레드가 예외를 발생시키면 프로세스가 종료되므로 예외처리에 신경 써야한다.


ex. 데이터를 분할해 병렬로 처리, 다수의 클라 요청 처리하는 서버 개발, ....


모든 자바 어플리케이션은 main thread가 main메서드를 실행시키면서 시작됨.

main threadsms 필용에따라 작업 스레드들을 만들어서 병렬로 코드 실행



Thread 객체 생성


1. java.lang.Thread 클래스 직접 객체화


Thread 클래스를 직접 객체화할 때는 Runnable 인터페이스의 구현객체를 매개값으로 가지며, 익명구현객체로도 가능


Thread 객체는 start() 메서드를 통해 실행되며, start() 메서드는 Runnable의 run() 메서드를 실행시킨다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package testAPI;
 
public class TestMain {
 
    public static void main(String[] args) {
 
        // Runnable 인터페이스의 구현객체를 매개값으로
        Thread thread = new Thread(new Task());
 
        // 익명구현객체
        Thread thread2 = new Thread(new Runnable() {
            public void run() {
 
            }
        }); // 익명구현객체 생성하고 세미콜론 잊지말기
 
        thread.start(); // 스레드 실행
 
    }
}
 




교재 예제)
메인스레드만 사용해서는 Beep 알림음 기능과 프린트 기능을 동시에 실행시킬 수 없다.(순차적으로만 가능)
작업 스레드를 이용해 여러 기능 동시 실행

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package testAPI;
 
public class TestMain {
 
    public static void main(String[] args) {
 
 
        Thread thread = new Thread(new BeepTask());
        
        //1.
        thread.start(); //작업스레드 thread 실행
        
        //2.
        for (int i=0;i<5;i++) {
            System.out.println("띵"); //프린트 실행
            try {Thread.sleep(500); } catch(Exception e) {}
        }
        
        //1번과 2번 동시 실행
    }
}
 
cs


BeepTask 구현 클래스 따로 만들 필요 없이 익명구현객체 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        // Thread thread = new Thread(new BeepTask());
        Thread thread = new Thread(new Runnable() {
 
            public void run() {
                Toolkit toolkit = Toolkit.getDefaultToolkit();
                for (int i = 0; i < 5; i++) {
                    toolkit.beep();
                    try {
                        Thread.sleep(500);
                    } catch (Exception e) {
                    }
                }
            }
        });r





2. Thread 하위 클래스로부터 객체 생성


실행할 작업을 Runnable로 만들지 않고, Thread 하위 클래스로 작업클래스 정의

작업 스레드 클래스를 만들어 Thread를 extends하고 run() 메서드 재정의

하위클래스의 객체를 생성해서 Thread 타입 변수에 담는다.


1
2
3
4
5
6
7
public class WorkerThread extends Thread {
 
    @Override
    public void run() {
 
    }
}
cs

하위 클래스에서 생성자 작성 안해도 기본생성자 자동 생성, 호출

1
2
3
4
5
6
7
8
9
10
11
12
        
        // 1. Thread thread = new WorkerThread();
        // 2. 익명구현객체
    
        Thread thread = new Thread() {
 
            @Override
            public void run() {
 
            }
        };
    }r







스레드의 이름


메인 스레드의 이름은 "main", 작업 스레드는 자동적으로 "Thread-n(스레드 번호)"로 설정됨
 
스레드 이름을 변경하고싶으면 setname("스레드이름");으로 변경, 하위클래스나 구현클래스의 생성자에 사용하기도 한다.
getname();으로 읽어오기

현재 스레드의 참조를 얻고 싶으면 현재 스레드 객체의 참조를 반환하는 Thread.currentThread(); 호출

Thread mainThread = TThread.currentThread();
System.out.println("현재 스레드 이름 :" + mainThread.getname());

출력 : 

현재 스레드 이름 : main



동기화 메서드 및 동기화 블럭


임계 영역(critical section)
단 하나의 스레드만 실행할 수 있는 코드 영역
임계 영역을 지정하기 위해 동기화(synchronized) 메서드와 동기화 블럭 사용
synchronized 키워드를 붙여 사용하며 인스턴스, 정적메서드 어디든 붙일 수 있다





스레드 우선순위(p.588)







Multi thread deposit withdraw(멀티스레드 중요예제)


https://stackoverflow.com/questions/29364771/how-to-handle-multithreading-in-simple-cash-deposit-withdraw-program


https://www.w3resource.com/java-tutorial/java-code-synchronization.php

'Java > study' 카테고리의 다른 글

제네릭(Generic)  (0) 2019.04.17
멀티스레드 Synchronized Account Testing  (0) 2019.04.16
Java 자주쓰는 단축키 모음  (0) 2019.04.15
예외 처리  (0) 2019.04.11
Calendar class의 객체는 싱글톤일까?  (0) 2019.04.10