Heestory

[JAVA]Thread 본문

개발(~국비)/JAVA

[JAVA]Thread

까만밀가루 2023. 4. 11. 13:11

쓰레드(Thread)

:하나의 실행 흐름을 나타내는 작업 단위

하나의 프로세스에서 독립적으로 실행될 수 있는 하나의 작업 단위

스레드 스케줄러에 의해 관리되며, CPU 할당을 받아 실행

 

Thread 클래스 : java에서 쓰레드를 생성하고 관리하기 위한 클래스

일반적으로 Thread와 다른 개념이지만, '쓰레드'라고 부르기도 한다.

실행 흐름인 쓰레드를 구현하는 클래스

 

 

단일 스레드(Single-threaded)

: 하나의 스레드만을 이용하여 , 한 번에 하나의 작업만 수행하며 순차적으로 실행

구현이 간단하고 예측이 가능하나, 처리 속도가 대규모 애플리케이션일수록 떨어지고, 성능에 제한이 있을 수 있다.

 

 

멀티스레드(Multithreading)

:하나의 프로세스에서 동시에 여러 개의 쓰레드를 실행

하나의 프로세스 내에서 여러 개의 실행 흐름을 동시에 실행하여 작업을 처리하는 것

대규모 데이터 처리나 다중 클라이언트 처리 등에 적합

병렬성을 확보하고, 시스템의 성능을 향상

 

 

 

Runnable, Callable

: Java에서 멀티스레드 환경에서 작업을 수행하기 위한 인터페이스

>Thread 클래스는 Runnable 인터페이스를 구현하여 멀티스레드를 구현할 수 있다.

 

Runnable

: 작업을 수행하는 메소드인 run()을 하나만 가지고 있는 함수형 인터페이스

  1. run() : 쓰레드가 실행될 때 실행, 메소드 내에서 쓰레드가 수행할 작업을 구현
  2. 매개변수 없음, 리턴값 없음
    작업을 수행하기 위해 외부에서 전달받아야 할 값이 있다면, 이를 쓰레드 생성 시점에 전달
  3. 함수형 인터페이스로 람다식으로 구현 가능
  4. 다른 클래스에서 쓰레드를 생성하여 해당 Runnable을 매개변수로 전달 가능 → run() 메소드 내에서 정의된 작업을 수행하게 된다.

생성방식

 

람다식을 이용하여 Runnable 인터페이스를 구현

Runnable myRunnable = () -> {
    // 실행할 코드 작성
};

 

익명 클래스를 이용하여 Runnable 인터페이스를 구현

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        // 실행할 코드 작성
    }
};

 

 

Runnable 인터페이스를 구현하는 클래스 생성

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 실행할 코드 작성
    }
}

 

 

Callable

:Runnable과 비슷하지만, 반환값이 있음

  1. call() : 작업을 수행한 후 결과를 반환
    Exception을 던질 수 있으므로, try-catch 구문을 사용하여 예외 처리
  2. ExecutorService 인터페이스와 함께 사용시 스레드 풀을 관리하고 Callable 객에 반환값을 받으며, 함께 사용하는 것이 일반적인 방법
    *스레드 풀(Thread Pool) : 작업 처리를 위해 미리 일정 개수의 쓰레드를 생성하여 유지
    이를 통해 쓰레드 생성, 삭제 과정에서 발생하는 오버헤드를 줄이고 생성비용을 최소화할 수 있다.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class Main {

    public static void main(String[] args) throws Exception {

        //ExecutorService인터페이스를 사용, MyCallable 객체를 실행하여 Future 객체로 받아 출력
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Future<Integer> future = executorService.submit(new MyCallable());

        Integer result = future.get();
        System.out.println(result);

        executorService.shutdown();
    }

}

 

 

'개발(~국비) > JAVA' 카테고리의 다른 글

[JAVA]Future  (0) 2023.04.10
[JAVA]subList  (0) 2023.04.10
ArrayIndexOutOfBoundsException 예외 발생 원인  (0) 2022.10.27
JAVA)배열 출력 하는 방법  (0) 2022.10.27