자바에서 Thread 만들기
자바에서 Thread 만들기
Thread 란?
- process : 실행 중인 프로그램 : 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨
- thread : 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread임
multi-threading
- 여러 thread가 동시에 수행되는 프로그래밍, 여러 작업이 동시에 실행되는 효과
- 다운로드하면서 화면에 보인다던지 / 여러 작업이 동시에 이루어지는 것처럼 보이는 -
- thread는 각각 자신만의 작업 공간을 가짐 ( context )
- thread는 thread 마다 독립적! 자신의 변수나 처리방법 등을 가지고 있음
- 각 thread 사이에서 공유하는 자원이 있을 수 있음 (자바에서는 static instance 스태틱 변수)
- 여러 thread가 자원을 공유하여 작업이 수행되는 경우 서로 자원을 차지하려는 race condition이 발생할 수 있음
- 이렇게 여러 thread가 공유하는 자원중 경쟁이 발생하는 부분을 critical section이라고 함
- critical section에 대한 동기화( 일종의 순차적 수행)를 구현하지 않으면 오류가 발생할 수 있음
- 같이 사용하는 자원을 한쪽 thread에서 사용하거나 변경 삭제했는데, 다른 쪽은 아직 모르거나 값이 적용 안됨.
- 실제로 동시에 이루어지는것 처럼 보이나 일종의 순차적 수행 - 동기화로 한쪽에서 사용하고 있을 때 다른 쪽에서 사용하지 못하도록 해준다.
자바 Thread 만들기
2가지 방법 - Thread 클래스 상속, Runnable 인터페이스 구현
Thread 클래스 상속하여 만들기
Thread를 상속받은 클래스 생성
-exends Thread 하면 Thread의 모든 메서드 사용 가능!
출력 테스트
- Tread 확인과 결과물 잘 돌아가는지 확인
Thread.currentThread( ) -> Thread [ 호출한 함수, 우선순위, 현재 Thread의 그룹 ]
①Thread [②main, ③5, ④main] start
①Thread -쓰레드
② main - 쓰레드를 호출한 함수 public static void main(String [] args)
③ 5 - 우선순위
④ main - Thread 그룹 표시 - 메인 그룹에 속해있다.
총 3개의 스레드 수행된 것이다. main Thread / th1 / th2
우리가 지금까지 프로그램할 때 어떤 쓰레드를 만들지 않고 메인에서 프로그램을 돌렸었는데
메인 쓰레드 하나가 돌아갔던 것이다 우리는 몰랐지만.
예제에서는 제일 먼저 시작되고 끝난 거 main Thread -> Thread 2개 생성해주고 시작해주고 끝
남은 2개의 Thread 인 th1과 th2 가 돌면서 스위치 되면서 200까지 찍는 거 확인
Runnable 인터페이스 구현하여 만들기
- 자바는 다중 상속이 허용되지 않으므로 이미 다른 클래스를 상속한 경우
- thread를 만들기 위해 Runnable interface를 구현하도록 한다.
출력 테스트
- Runnable한 객체 생성해주고 thread 만들어서 시작해주기
- Thread 확인 , 출력 결과물 확인

exends Thread로 돌렸던 결과물 마찬가지로 main Thread 가 제일 먼저 시작되고 끝남
남은 2개의 thread 가 돌면서 프로그램 실행!
+@ 간단하게 쓰레드 돌릴 경우
Thread Status - 쓰레드 상태
쓰레드 상태
thread 풀 에 있는 상태 - CPU를 배분받으려고 기다리는 애들 - 이런 Thread 들을 Runnable 한 상태라고 한다. - 여기 있는 애들은 언제든지 CPU 배분받으면 CPU 점유할 수 있는 애들
CPU를 절대 점유할 수 없는 애들의 상태 - Not Runnable
Not Runnable 상태로 갈 수 있는 경우 - 3가지 메서드 호출되었을 때 가능 - sleep(밀리세컨드) , wait(), join()
- sleep ( 시간 ) - 잠 깐 자는 상태 , 지정된 시간이 지나면 Runnable 상태로 돌아간다
- wait( ) - 리소스가 한정되어있고, 여러 Tread가 있다 할 때 Thread 들을 리소스가 유효한 쓰레드 생길 때까지 기다려하는 것 - 리소스가 유효한 상태가 되면 프로그램에서 notify() 때린다. 일어나! - 그러면 wait 메서드로 NotRunnable 상태 있는 애들 중에 무작위로 하나가 깨어남 - notify all () 은 wait 메서드로 NotRunnable 상태 있는 애들 다 깨운다.
- join() - thread 동시에 돌아갈 때 다른 쓰레드 결과 값을 지금 쓰레드에서 참조해야 되는 상황일 때 - 지금 Thread에 join() 함수를 호출하면 지금 Thread 가 NotRunnable 상태로 간다. - join() 건 Thread 가 끝나면 Runnable 상태로 돌아간다.
쓰레드의 기본 상태들
메서드들도 더 많지만 찾아보면서 해보기.
review
Thread
프로그램이 수행되는 단위 Process - Process를 수행하는 단위 Thread
Process는 하나 이상의 Thread를 가진다. 단일 / 멀티 Thread
race condition / critical section - 해결하기 위한 동기화( 일종의 순차적 수행)
Thread 만드는 2가지 방법
Thread 클래스 상속 / Runnable 인터페이스 구현 / 간단하게 돌릴 경우 new Runnable() 방법도 있다.
Runnable과 NotRunnable 상태 - CPU를 점유할 수 있는 상태인가 없는 상태인가
NotRunnable 상태로 갈 때의 조건과 빠져나올 때 함수와 조건 체크
뒤에 이어서 실습하면서 살펴볼 예정!
프로세스를 수행하는 단위인 Thread.
class에 단순히 main 함수를 넣고 돌린다라고만 써왔는데
실제로는 main 함수가 main그룹에 있는 thread를 호출해서 실행시켜준 것이었다.
뒤에 더 살펴보아야겠지만 main Thread는 사용자가 만든 Thread를
생성해주고 시작해주는 기능만 수행하고 끝내는 Thread라고 이해하였다.
남은 프로세스들은 내가 만든 Thread로 수행!
코드를 잘 짜 놨어도 Thread를 잘 못 불러주면 실행이 안 되는 건가?
좀 더 알아봐야겠다.