본문 바로가기

언어/java

멀티 스레드

1. 간단한 스레드의 설명

프로세스는 운영체제로부터 작업을 할당받는 작업의 단위이고

스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다.

스레드는 스레드 그룹에 속해있다.

 

작업(프로세스) 처리는 cpu가 한다. 

CPUtime은 프로세스를 처리하는 시간이다.

스케쥴링 하여 프로세스의 우선순위를 결정한다.

멀티코어로 멀티 프로세스를 할 수 있다.

멀티 프로세싱이 멀티 태스킹의 용어에 더 가깝다.

 

프로세스는 호출할 때마다 문맥교환이라는 오버헤드가 발생한다.

스레드로 처리를 하면 프로세스끼리 통신하는 비용보다 통신 비용이 적고,

문맥교환이 적게 발생해 더 효율적인 작업이 가능하다.

 

스레드는 굳이 앞뒤 순서가 필요 없는 일들이 있을 때 분리해

동시에 처리하고 싶을 때 사용한다.

이 멀티 스레드 2개 이상의 스레드가 한 프로세스 내에서 처리되는 것이라 할 수 있다.  

 

프로세스는 적어도 하나의 스레드를 가지고 있다. 그 적어도 하나를 메인 스레드라고 한다.

메인 메소드는 main()을 실행한다. 

싱글 스레드에서 메인 스레드가 끝날때는

마지막 코드가 수행되거나 아님 return으로 끝날때이다.

하지만 멀티 스레드에서는 모든 스레드가 다 종료되어야 끝난다.

 

 

2. 자바의 멀티 스레드 구현

두가지 방법이 있다.

첫번째로 Ruunable 인터페이스를 implements 하기

두번째로 Thread 클래스를 extend 하기

 

--1. Runnable 인터페이스를 implements 하기

main 스레드 외의 스레드에서 돌아가는 코드를 만들 때

Ruunable 을 implement 한 클래스를 만든다. 

그리고 run() 이라는 메소드를 override 해서 이 메소드에서 실행할 코드를 작성하자

a. Ruunable를 implements 한 경우

1
2
3
4
5
6
7
8
9
10
public class SampleThreadClass implements Runnable{
    
    @Override
    public void run() {
        //스레드가 실행할 코드
        
    }
 
}
 
cs

그리고 Runnable 을 구현한 객체를 새로운 Thread 객체의 선언시 매개변수로 주고

Tread 객체의 메소드인 start() 를 호출하면

새로운 스레드가 실행이 된다.

1
2
3
4
5
6
7
8
9
10
11
public class SampleThreadRunClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SampleThreadClass sampleThreadClass = new SampleThreadClass(); 
        Thread thread = new Thread(sampleThreadClass);
        thread.start();
    }
 
}
 
cs

 

b. 익명 클래스를 사용하는 경우

a의 경우와 같다. 익명클래스를 사용하는 것 뿐이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SampleThreadRunClass {
 
    public static void main(String[] args) {
        
        Thread thread = new Thread(new Runnable() {
            
            @Override
            public void run() {
                // 실행할 코드
                
            }
        });
        thread.start();
    }
 
}
cs

 

--2. Thread 를 상속하는 경우

 

Thread 클래스를 상속하는 하위클래스를 만들고 

run() 메소드를 override 하여 실행할 코드를 작성하자

1
2
3
4
5
6
7
8
9
public class SampleThreadClass extends Thread{
    @Override
    public void run() {
        //스레드가 실행할 코드
        
    }
 
}
 
cs

그리고 만든 클래스를 사용하여 Thread 인스턴스를 만들고

start() 메소드로 다른 Thread를 실행하자

1
2
3
4
5
6
7
8
9
10
public class SampleThreadRunClass {
 
    public static void main(String[] args) {
        
        Thread thread = new SampleThreadClass();
        thread.start();
    }
 
}
 
cs

다음과 같이 익명객체로 생성할 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SampleThreadRunClass {
 
    public static void main(String[] args) {
        
        Thread thread = new Thread() {
            public void run() {
                //실행할 코드
            }
        };
        thread.start();
    }
 
}
cs

 

3.동기화 블록 

 

동기화는 하나의 스레드만 실행할 수 있도록 정해주는 것이다.

메소드 또는 블록에다 동기화를 한다.

자바 예시

public synchronized void method()

혹은 

synchronized{       }

 

스레드의 상태는 

스레드 객체 생성, 대기(Runnable),종료  단계로 다뉜다..

1.start()를 하면 -> 대기 상태가 된다.

2.대기상태에서 자기 순서가 오면 -> 실행을 한다

3.수행 다 하면 종료

 

 

2.과정에서 

일시정지가 가능하다

a.waiting ; 계속 기다림

b.timed_waiting :일정 시간 동안 기다림

3.blocked : 사용하는 객체의 락이 해제될 동안 기다림

등등

 

스레드의 상태제어

정지 기능

join()

sleep()

 

협업기능

wait()

notify()

notifyAll()

 

종료기능

stop 플래그 ex) private boolean stop; 

interrupt()

 

 

 

 

'언어 > java' 카테고리의 다른 글

람다식  (0) 2021.01.08
데몬 스레드  (0) 2021.01.07
자바 리플렉션  (0) 2021.01.04
static에 관한 정리  (0) 2021.01.04
배열  (0) 2020.12.30