프로세스&쓰레드

man soup·2020년 10월 21일
0

자바 문법

목록 보기
12/15

Concurrency(동시성)

concurrent software : 동시에 여러 일을 처리할 수 있는 소프트웨어
자바 플랫폼은 동시성 프로그래밍 지원

프로세스

독립된 실행 환경 가짐 (독립된 메모리 공간)
프로세스간에는 IPC 자원(파이프 또는 소켓)을 통해 통신 (다른 시스템에 존재하는 프로세스와도 통신 가능)
대부분의 JVM은 싱글 프로세스로 구현됨
jvm에서 ProcessBuilder 객체를 통해 추가적인 프로세스를 생성할 수 있음

쓰레드

쓰레드와 프로세스 모두 실행 환경을 제공하지만 새로 생성할때 쓰레드가 더 적은 자원 필요
쓰레드는 프로세스안에 존재
프로세스의 메모리와 열린 파일들 같은 자원을 공유 -> 효과적이지만 문제 일으킬 수 있음
자바 플랫폼에서 모든 어플리케이션은 적어도 하나이상의 쓰레드 가지고 있음( 시스템 쓰레드 포함한다고 하면 무조건 여러개이상)
(시스템 쓰레드 - 메모리 관리, 시그널 핸들링)
애플리케이션 프로그래머 관점으로는 하나의 쓰레드로 시작(main thread)
이 쓰레드는 추가적인 쓰레드를 생성할 수 있는 기능을 가짐

Thread Objects

쓰레드 객체를 사용해 동시성 어플리케이션 만드는 방법 2가지
1. 어플리케이션이 비동기 테스크 시작이 필요할때마다 Thread를 직접 인스턴스화
2. 어플리케이션의 테스크를 executor에게 전달

쓰레드 정의 및 시작

쓰레드 인스턴스를 생성하려면 그 쓰레드에서 run할 코드를 무조건 제공해야하는데 2가지 방법 존재

1. 쓰레드 생성자에 Runnable 객체를 아규먼트로 제공

러너블 인터페이스는 run메소드만 정의함
run메소드란 쓰레드에서 실행될 코드를 뜻함

2. Thread를 상속받아서 사용

Thread는 Runnable을 구현하고 있다 ( 아무것도 안함 )

1,2 방법을 통해 Thread를 인스턴스화 시키고 start메소드 호출하면 새로운 쓰레드가 시작

( (new Thread(new HelloRunnable())).start(); 또는 (new HelloThread()).start(); )

1,2 방법의 차이

Runnable을 사용하면 다른 클래스를 상속받을 수 있다
Thread를 사용하면 사용이 편하지만 상속불가 (Thread를 상속받으므로)
Runnable을 사용하는데 좀더 유연하고 고레벨 쓰레드 관리 API를 적용할 수 있다.

Thread 클래스 메소드

쓰레드 클래스에는 쓰레드 관리를 위한 여러가지 유용한 메소드가 정의되어있음

Pausing Execution with Sleep

Thread.sleep(시간);
현재 쓰레드를 잠재움
다른 쓰레드에게 프로세서 타임을 주는 효과적인 방법
내가 정한만큼 정확하게 자지않음 ( OS에 의존적 )
인터럽트가 오면 깨어나면서 InterruptedException 던짐

Interrupts

인터럽트는 쓰레드에게 현재하고있는 일을 그만하고 다른 일을 하라고 지시하는 것
쓰레드가 인터럽트에 어떻게 반응할지는 프로그래머가 정하지만 보통 쓰레드 종료가 국룰
쓰레드(A)는 인터럽트할 쓰레드(B) 객체의 interrupt 메소드를 호출해 인터럽트를 보낸다.
Thread(B).interrupt로 인터럽트 보내면 Thread B의 인터럽트 flag가 set됨
자신의 쓰레드가 인터럽트 받았는지 확인하려면 Thread.interrupted 호출, 호출시 인터럽트 flag 초기화됨 객체 메소드인 isInterrupted는 상태 flag 변경x
인터럽트 메커니즘이 제대로 작동하려면 인터럽트를 받는 쓰레드가 자신의 인터럽트에 대해 지원해야한다. ( 인터럽트 당하는 쪽에서 인터럽트 처리를 해줘야한다는 뜻 ex) catch InterruptedException)

Joins

한 쓰레드(A)가 다른 쓰레드(B)의 완료를 기다릴때 사용하는 메서드
A에서 중간에 B.join() 하면 A 멈춘후 B끝나길 기다림
오버로드된 join메소드를 사용해 기다리는 기간 명시할 수 있지만 sleep과 같이 OS에 따라 정확한 시간 선택 불가
sleep과 같이 interrupt를 받으면 InterruptedException를 던진다

출처 :
https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

profile
안녕하세요

0개의 댓글