개발/JAVA

[JAVA] 멀티스레드

mabb 2022. 5. 19. 10:51
반응형

 안녕하세요. 삶의 질을 높이고자 노력하는 영차영차입니다.
자바 기본기를 탄탄히 다지기 위한 공부 목적 포스팅입니다.
이것이자바다, HeadFirstJava 등의 교재와 구글링을 토대로 본인의 이해를 위해 작성하였으며
계속해서 살을 붙여나갈 계획입니다.
틀린 부분이 있을 경우 댓글 남겨주시면 감사하겠습니다.
---------------------------------------------------------------------------------------------------------

WHY
- 멀티 태스킹을 하기위하여
- 아주 많은 클라이언트의 요청을 처리하기위한 서버를 개발할 때

 

멀티 태스킹

한 순간에 두 가지 이상의 작업을 병렬적으로 동시에 처리하는 것.

지금까지 만들어왔던 코드는 모두 싱글스레드였다!

하나의 코드흐름. 반복문을 돌고 있는 그 순간에 다른 작업을 할 수 없었다

 

main()메소드는 메인스레드

자바의 실행메소드인 main메소드 안에서 실행하는 코드의 흐름이 메인 스레드임. 메인스레드에 작업스레드(객체)를 추가하여 병렬적인 작업 수행이 가능하다. 실행 중인 스레드가 하나라도 있으면 프로그램은 종료되지 않는다.

스레드 : 코드의 실행 흐름.
프로세스 : 실행 중인 하나의 애플리케이션. 운영체제로부터 메모리를 할당받아 실행됨. 프로세스끼리는 메모리를 공유하지 않음.

Thread 클래스. 정말 웬만한 건 다 클래스

 

Thread (Java SE 18 & JDK 18)

All Implemented Interfaces: Runnable Direct Known Subclasses: ForkJoinWorkerThread A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently. Every thread has a

docs.oracle.com

 

Thread 객체를 만드는 방법

방법1. Runnable 구현객체를 매개변수로 받는 Thread생성자를 통해 객체를 생성한다. Runnable인터페이스의 run()메소드에 작업스레드의 실행내용을 작성한다.
1)구현클래스를 만들어 구현객체를 매개변수로 사용하기.
2) 익명구현객체를 매개변수로 사용하기
3) 람다식을 사용하기

방법2. Thread의 자식클래스를 만들고 Thread의 run()메소드에 작업스레드의 실행내용을 오버라이드한다.
자식클래스를 만들어 자식객체를 대입하기.

두 방법의 차이는 Runnable이 함수적 인터페이스라서 람다식을 사용할 수 있다는 점이 아닐까 생각해본다.

 

*Thread thread = Thread.currentThread();
현재 실행하는 스레드의 참조를 얻는다.

 

Concurrency 와 Parallelism

Concurrency - >아주 빠르게 번갈아 실행하여 동시에 작업하는 것처럼 보이게 하는 것
Parallelism -> 실제로 동시에 작업을 실행하는 것

CPU의 코어 개수보다 스레드가 더 많을 경우 Concurrency하게 됨. 이럴 경우 어떤 스레드의 실행을 더 우선시 해야할지 결정해야 한다.

 

스레드의 우선순위

Priority 방식. 스레드에 1~10의 우선순위값을 부여한다. 우선순위가 가장 높은것은 10. 스레드가 CPU코어보다 적다면 의미가 크게 없다. 개발자가 우선순위를 설정할 수 있다.

Round-Robin방식.  시간할당량을 정해서 스레드를 순환시키며 실행함. JVM의 영역으로 개발자가 할 수 없다.

 

공유객체

같은 프로세스 안의 스레드끼리는 메모리를 공유할 수 있음.  여러개의 스레드가 하나의 객체를 공유해서 같이 사용할 경우 한 스레드에서 객체를 가지고 작업을 하는 동안 다른 스레드가 건드려서 결과가 엉망진창이 될 수 있다.

 

임계영역 Critical Section

공유객체에 동기화메소드  또는 동기화블록을 설정함으로써 임계영역을 만들 수가 있으며 임계영역 내에 작성한 것을 하나의 스레드에서 실행중인 경우 다른 스레드에서는 임계영역에 접근할 수 없다. (일반 메소드 접근은 가능함)

public class Member{
  public synchronized void setName(String name){
      // synchronized로 동기화메소드로 선언, 동기화메소드를 스레드에서 사용중일 때 다른 스레드에서 접근이 불가하다.
}  

  public void setJob(String job){

 synchronized(this){                   
      //메소드 내에 동기화블록을 만들면 해당 블록 속의 내용을 스레드에서 사용중일 때 다른 스레드에서 접근이 불가하다
    }
}

임계영역 속의 코드가 실행중일 때 다른 스레드는 대기상태.

 

 

스레드 상태제어, 데몬스레드(메인스레드의 보조스레드), 스레드 그룹, 스레드 풀 등...

반응형

'개발 > JAVA' 카테고리의 다른 글

[JAVA] 다형성  (3) 2022.05.23
[JAVA] 스트림과 병렬처리  (0) 2022.05.19
[JAVA] 람다식  (0) 2022.05.19
[JAVA] 제네릭  (0) 2022.05.19
[JAVA] 예외처리  (0) 2022.05.19