Multi Thread(멀티스레드) - 1 (스레드 기초, 동시성과 병렬성, 동기화 메소드와 블록)

dykwon·2024년 1월 15일
  1. 프로세스와 스레드

    • OS에서는 실행 중인 하나의 애플리케이션을 Process라고 부른다.
    • 만일 Chrome 브라우저를 2개 실행하고 TaskManager에서 2개의 chrome.exe를 보았다면 이는 2개의 프로세스가 실행된 것
    • 스레드는 한 가닥의 실이라는 뜻이로, 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 이어 놓았다고 해서 유래된 이름
  2. 작업 스레드의 생성과 실행
    Runnable은 실행할 수 있는 코드를 가지고 있는 객체이다.
    Runnable에는 run() 메소드 하나만 정의 되어있으며, 구현 클래스에서는 이를 재정의해서 사용한다.

    • Thread Class로 부터 생성
    Runnable t = new Thread(new Runnable(){
        public void run(){
         // Task 내용
        }
    })
    
    Runnable t = new Thread(()->{
        // Task 내용
    })
    
    t.start();
    • Thread 하위 클래스로부터 생성 (오버라이드)
    public class WorkerThread extends Thread{
    	@Override
        public void run(){
        }
    }
    
    Thread t = new WorkerThread();
    t.start();
  3. 스레드의 이름
    스레드는 자신의 이름을 갖고 있다. 메인 스레드는 main, 우리가 생성한 스레드는 Thread-n 이라는 이름로 생성된다.

    • Thread 이름 설정과 가져오기
    thread.setName("Name"); // 이름 세팅
    thread.getName(); // 이름 가져오기
    Thread currentThread = Thread.currentThread(); // 현재 스레드에 대한 참조
  4. 동시성과 병렬성

    • 멀티스레드는 동시성과 병렬성으로 실행된다.
    • 동시성은 멀티 작업을 위해 하나의 코어에서 멀티스레드가 번갈아가며 일하는 성질
    • 병렬성은 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
  5. 자바의 스레드 스케줄링

    • 우선순위 방식과 순환할당(라운드로빈) 방식을 사용
    • 우선순위 방식의 경우 아래와 같이 설정이 가능.
    • thread.setPriority(Thread.MAX_PRIORITY);
    • thread.setPriority(Thread.MIN_PRIORITY);
    • thread.setPriority(Thread.NORM_PRIORITY);
  6. 동기화 메소드와 블록
    - 멀티스레드 프로그램에서 스레드가 객체를 공유해서 작업하는 경우

    • Thread-Safe 하지 못해서 데이터에 대한 정합성과 신뢰성이 떨어지며 트랜잭션에 문제가 발생
    • 이를 해소하기 위해 임계 영역(동기화 메소드와 동기화 블록)을 설정
      - 임계영역(Critical Section)은 멀티스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 뜻함
    • 동기화 메소드
      - 메소드 선언 시, synchronized 키워드를 사용
      public synchronized void methodName(){
      	// 임계영역
      }
    • 동기화 블록
      - 메소드 일부 내용만 임계영역으로 사용
      public void methodName(){
      	// 코드 1
          public synchronized void setMem(int 공유객체) {
          	// 코드 2(임계영역)
          }
          // 코드 3
      }
profile
Programmer, who turns ideas into value

0개의 댓글