Thread 쓰레드 : 프로세스(실행중인 프로그램)에서 하나의 실행 흐름을 말한다. JVM 도 프로세스.
자바는 멀티 쓰레드를 지원하고, 멀티 쓰레드란 하나의 프로그램에서 여러 개의 실행 흐름을 만들고 실행 할 수 있는 것이다.
멀티쓰레드는 왜 사용할까?
외부와의 연계같이 대기 시간이 발생할 때 기다리는 동안 다른 작업을 처리할 수 있게 하기 위함이다. 처리 속도를 향상시키기 위함.
쓰레드 만드는 법.
1. Runnable 인터페이스를 구현하는 클래스를 만든다. (Runnable 인터페이스에는 run() 메소드가 유일하다. 이 메소드를 반드시 구현해주어야 한다.)
(메소드가 하나인 인터페이스 -> 람다 인터페이스) MyThread implements Runnable {}
2. 인터페이스를 구현한 클래스 객체를 만든다. MyThread myThread = new MyThread();
3. 2에서 만든 객체를 가진 스레드 객체를 만든다. Thread th = new Thread( myThread -- Runnable을 구현한 클래스 객체);
4. 스레드 실행한다. th.start();
쓰레드 풀.
스레드 개수를 제한할 때 사용. 쓰레드 풀을 3개로 제한하고 많은 Runnable 객체를 4개 이상 만든다면 앞에서 Runnable 객체가 먼저 실행되고 실행이 끝나면 다음 Runnable 객체가 들어가게 된다.
쓰레드 safe
멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없음을 뜻한다. 보다 엄밀하게는 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의한다.
멀티쓰레드로 동작하는 프로세스에서 자원을 공유하게 될때에는 thread safe 하게 프로그램을 만들어야 한다.
해결법으로는 synchronized 사용하기
Thread-safe를 지키기 위한 방법
1. Re-entrancy
어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하더라도 그 결과가 각각에게 올바로 주어져야 한다.
2. Thread-local storage
공유 자원의 사용을 최대한 줄여 각각의 스레드에서만 접근 가능한 저장소들을 사용함으로써 동시 접근을 막는다.
이 방식은 동기화 방법과 관련되어 있고, 또한 공유상태를 피할 수 없을 때 사용하는 방식이다.
3. Mutual exclusion
공유 자원을 꼭 사용해야 할 경우 해당 자원의 접근을 세마포어 등의 락으로 통제한다.
4. Atomic operations
공유 자원에 접근할 때 원자 연산을 이용하거나 '원자적'으로 정의된 접근 방법을 사용함으로써 상호 배제를 구현할 수 있다.