[Java] 스레드

승 아·2023년 3월 10일
0

프로세스(Process)와 스레드(Thread)

프로세스

  • 실행 중인 애플리케이션
  • 애플리케이션 실행 시 운영체제로부터 실행에 필요한 만큼의 메모리를 할당 받음

스레드

  • 데이터와 애플리케이션이 확보한 자원을 활용하여 소스 코드를 실행
  • 프로세스 내에서 실행되는 소스 코드의 실행 흐름

메인 스레드(Main thread)

메인 스레드

  • 자바 애플리케이션 실행 시 가장 먼저 실행되는 메서드는 main 메서드로, 메인 스레드가 main 메서드를 실행시켜줌
  • 자바 애플리케이션의 소스코드가 싱글 스레드이면, main스레드만 가지는 싱글 스레드 프로세스가 됨

멀티 스레드(Multi-Thread)

싱글 스레드 프로세스

  • 단 하나의 스레드를 가지는 프로세스

멀티 스레드 프로세스

  • 여러 개의 스레드를 가지는 프로세스로, 여러 스레드가 동시에 작업을 수행

  • 어떤 프로세스가 멀티 스레드로 동작한다는 것은 해당 애플리케이션이 동시 작업을 할 수 있다는 것을 의미
    ex) 메신저 애플리케이션은 멀티 스레드로 동작 -> 메세지를 주고 받으며 동시에 파일을 업로드

작업 스레드 생성과 실행

작업 스레드

  • 메인 스레드 외 별도의 작업 스레드 활용하는 것은 작업 스레드가 수행할 코드를 작성하고, 작업 스레드를 생성하여 실행시키는 것

  • run() 메서드에 스레드가 처리할 작업을 작성하도록 규정, run() 메서드에는 Runnerable 인터페이스와 Thread 클래스로 정의 되어 있음

작업 스레드를 생성하고 실행하는 방법

  1. Runnerble 인터페이스를 구현한 객체에서 run()을 구현하여 스레드를 생성하고 실행

  2. Thread 클래스를 상속 받은 하위 클래스에서 run()을 구현하여 스레드를 생성하고 실행

    • Runnerble 인터페이스와 달리 Thread 클래스를 직접 인스턴스화하지 않음

익명 객체를 사용하여 스레드 생성과 실행

  • 자바는 객체지향 언어로 클래스 안에 코드를 작성해야 하지만, 익명 객체를 활용하면 클래스를 따로 정의하지 않고도 스레드를 생성하고 실행시킬 수 있음

스레드의 이름

  • 메인 스레드는 "main"이라는 이름을 가짐

  • 그 외에 추가적으로 생성한 스레드는 "Thread-n"이라는 이름을 가짐

  • 스레드의 이름은 스레드의참조값.getName() 로 조회할 수 있고,
    스레드의참조값.setName() 로 설정할 수 있음

스레드의 동기화

  • 멀티 스레드 프로세스는 두 스레드가 동일한 데이터를 공유하게 되어 문제가 발생할 수 있으므로 두 스레드가 하나의 스레드에 동시에 접근하지 못하도록 하는 것

  • Thread.sleep() : 스레드를 일시 정지시키는 메서드로, try … catch문의 try 블럭 내에 작성해주어야 함

  • 어떤 스레드가 일시 정지되면, 대기열에서 기다리고 있던 다른 스레드가 실행됨

임계 영역(Critical section)과 락(Lock)

임계 영역

  • 오로지 하나의 스레드만 코드를 실행할 수 있는 코드 영역

  • 임계 영역을 포함하고 있는 객체에 접근할 수 있는 권한

ex) 임계 영역으로 설정된 객체가 다른 스레드에 의해 작업이 이루어지고 있지 않을 때, 임의의 스레드 A 는 해당 객체에 대한 락을 획득하여 임계 영역 내의 코드를 실행할 수 있다. 스레드 A가 임계 영역 내의 코드 실행 중일 때는 다른 스레들은 락이 없으므로 이 객체의 임계 영역 내의 코드를 실행할 수 없다.

특정 코드 구간을 임계 영역으로 설정할 떄는 synchronized 키워드를 사용하고, 두 가지 방법으로 사용할 수 있다.

  1. 메서드 전체를 임계 영역으로 지정
  • 메서드의 반환 타입 좌측에 synchronized 키워드를 작성
  • 메서드가 호출되었을 때, 메서드를 실행할 스레드는 메서드가 포함된 객체의 락을 얻으므로 해당 스레드가 락을 반납하기 전 다른 스레드는 해당 메서드의 코드를 실행하지 못함
  1. 특정한 영역을 임계 영역으로 지정
  • synchronized 키워드와 함께 소괄호(()) 안에 해당 영역이 포함된 객체의 참조를 넣고, 중괄호({})로 블럭을 열어, 블럭 내에 코드를 작성
profile
개발 공부를 기록하는 공간

0개의 댓글

관련 채용 정보