티스토리 뷰

CS/JAVA

[JAVA] Thread

코딩가딩 2021. 6. 17. 23:53

Thread


 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스에는 한 개 이상의 스레드가 존재하고 작업을 수행한다. 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라고 한다.

 

* Process

 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당받아 실행중인 것을 말한다. 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성된다. 즉, 실행중인 하나의 어플리케이션.

 

  • JVM에 의해 하나의 프로세스가 발생하고 main() 안의 실행문들이 하나의 스레드이다.
  • 실행 중에 멈출 수 있으며 동시에 수행이 가능하다.
  • main() 이외의 또 다른 스레드를 생성하려면 Thread 클래스를 상속하거나 Runnable 인터페이스를 구현한다.
  • 다중 스레드 작업 시에는 각 스레드끼리 정보를 주고 받을 수 있어서 처리 과정의 오류를 줄일 수 있다.
  • 프로세스끼리는 정보를 주고 받을 수 없다.

 

스레드 생성

1. Thread 클래스를 상속

-> thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없으므로, 일반적으로는 Runnable 인터페이스를 구현한다.

2. Runnable 인터페이스를 구현

 

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
class ThreadWithClass extends Thread {
 
    public void run() {
            // logic
 
    }
}
 
 
class ThreadWithRunnable implements Runnable {
    // 이 자체가 스래드는 아님. 스래드가 실행할 코드만 포함하고 있는 클래스.
    public void run() {
            // logic
    }
}
 
 
public class Test {
 
    public static void main(String[] args){
 
                // Thread 클래스를 상속하여 스레드 선언
        ThreadWithClass thread1 = new ThreadWithClass();
 
                // Runnable 인터페이스를 구현하여 스레드 선언
        Thread thread2 = new Thread(new ThreadWithRunnable());
 
        thread1.start(); // 스레드의 실행
        thread2.start(); // 스레드의 실행
 
    }
}
cs

- 별도 클래스에서의 구현, 무명 구현 객체, 람다식 모두 가능

 

 

멀티 스레드

  • 멀티 스레드는 메인 스레드가 종료되더라도 실행 중인 스레드가 하나라도 있으면 프로세스가 종료되지 않는다.
  • run() 메소드가 종료되면 스레드가 종료된다.
    -> 스레드를 계속 실행시키려면 run() 메소드를 무한 루프 속에서 실행시켜야 한다.
  • 한 번 종료한 스레드는 다시 시작시킬 수 없으며 무한 루프 속에서 실행시켜야 한다.
  • 한 스레드에서 다른 스레드를 강제 종료할 수 있다.
  • 장점 : 메모리 공유로 인한 시스템 자원 소모가 줄고 동시에 두 가지 이상의 활동을 할 수 있다.
  • 단점 : 서로 자원 소모를 하다가 충돌이 일어날 가능성이 존재하며 코딩이 난해해져 버그 생성확률이 높아진다. (동기화, 교착상태 ...)

 

스레드 상태 6가지

1. NEW : 스레드가 생성되었지만 아직 실행할 준비가 되지 않은 상태

2. RUNNABLE : 스레드가 실행되고 있거나 실행준비되어 스케쥴링을 기다리는 상태

3. WAITING : 다른 스레드가 notify(), notifyAll()을 불러주기를 기다리고 있는 상태

4. TIMED_WAITING : 스레드가 sleep(n) 호출로 인해 n밀리초동안 잠을 자고 있는 상태

5. BLOCK : 스레드가 작업을 완료하지 못하고 잠시 작업을 멈추는 상태. 스레드가 I/O 요청을 하면 자동으로 스레드를 BLOCK 상태로 만듦.

6. TERMINATED : 스레드가 종료한 상태

 

스레드 우선순위

  •  2개 이상의 스레드가 동작 중일 때 우선 순위를 부여하여 우선 순위가 높은 스레드에 실행의 우선권을 부여할 수 있다.
  • static final int MAX_PRIORITY : 스레드가 가질 수 있는 최대 우선순위를 명시
  • static final int MIN_PRIORITY : 스레드가 가질 수 있는 최소 우선순위를 명시
  • static final int NORM_PRIORITY :  스레드가 생성될 때 가지는 기본 우선순위를 명시
  • getPriority()와 setPriority() 메소드를 통해 스레드의 우선순위를 반환하거나 변경할 수 있다. 우선순위가 가질 수 있는 범위는 1~10이며 숫자가 높을수록 우선순위가 높아진다.
  • main() 스레드의 우선 순위 초기값은 5이다.

 

 

 

 

'CS > JAVA' 카테고리의 다른 글

[JAVA] 메모리 구조  (0) 2021.06.16
[JAVA] 변수의 종류  (0) 2021.06.16
[JAVA] 접근 제어 지시자  (0) 2021.06.16
[JAVA] Wrapper Class, Generic  (0) 2021.06.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함