프로세스
메모리를 할당받아 실행중인 프로그램. 운영체제로부터 실행에 필요한 메모리를 할당받아 어플리케이션의 코드를 실행
Thread
- 하나의 프로세스 내부에서 독립적으로 실행되는 작업 단위. 프로세스 내에서 실행되는 흐름의 단위.
- 프로세스 내부에 thread가 한개 -> 단일 스레드. single thread / 두개 이상 -> multi Thread - 서로 독립적. 오류발생해도 서로 영향x
- 하나의 스레드 내부에서 작업 처리 단계는 순차적!
-JVM에 의해 하나의 프로세스 발생 -> 메인 쓰레드가 main함수 실행하면서 어플리케이션 실행됨
여기에 다른 thread가 없을 경우 single thread 이고,
메인 스레드 내에서 다른 thread들을 만들게 되면 multiThread되는거임 (main method안에서 thread 호출)
MultiThread
: 프로세스가 두개 이상의 서브 프로세스로 나누어져서 동시에 병렬로 구현될 수 있는 프로그래밍 개념.
걍 여러 thread를 써서 한번에 여러 작업 처리하는 것
-> 병렬 (동시 실행) 처리 가능, cpu의 유휴시간 활용 가능, 우선순위에 따른 작업 순서 지정 가능
-> run안에 for문잇어도 그걸 한번에쭉실행하는게아니라 왓다갓다하면서 한다
Thread 만들기
1. Thread class를 상속받는다
public class ThreadName1 extends Thread{ ~ } 이렇게 Thread를 상속한 클래스를 만든다
2. Runnable interface를 구현한다
public class ThreadName2 implements Runnable{ ~ } 이렇게 Runnable을 implement한 클래스를 만든다
두 class에는 모두 run이라는 함수존재함
-> 실행할 내용을 이 함수에 적어준다
public void run(){ ~ }
그리고 이제 메인에서 새 객체 new 한 담에 .start()하면 스레드 실행!
1. Thread 상속
ThreadName1 t1=new ThreadName1(); // 걍 이렇게 평범하게 new 해주면 됨
t1.start();
2. Runnable 인터페이스
Thread t2=new Thread(new ThreadName2()); //이렇게 new Thread의 매개변수로 넣어줘야함 !!
t2.start();
(Thread 클래스를 상속받으면 다른 클래스를 상속받을 수 없으므로, 일반적으로 Runnable 인터페이스를 구현하는 방법으로 스레드를 생성합니다.)
Thread LifeCycle
1. Runnable : 준비상태
- CPU를 점유하여 실행하기 위해 대기하고 있는 상태 ! (Running 이전)
- start()호출하면 run()메소드에 설정된 스레드가 Runnable 상태 진입
걍 start()하면 해당 스레드가 준비상태가 된다
2. Running : 실행 상태
- CPU를 점유하여 실행중인 상태
- Runnable상태의 여러 thread중 우선순위를 가진 thread가 결정되면 JVM이 자동으로 run() 호출하여 thread가 Running 상태 진입
어떤걸 먼저 실행할지 결정하면 자동으로 run()실행하며 running된다
3. Dead : 종료 상태
- 스레드가 모두 실행된 후 완료되엇거나 , kill된 상태
4. Blocked : 지연 상태
- CPU 점유권을 상실
- sleep() 메소드에 의해 블럭되면 일정 시간 지나면 다시 runnable됨
- wait() 메소드에 의해 블럭되면 notify() 호출되면 다시 runnable됨
- I/O 관련 메소드에 의해 I/O Blocked된거면 그거 메소드 실행끝나면 다시 runnable됨
Priority
: Thread에 우선순위 지정 가능 ! -> 실행 순서에 영향을 준다
ThreadName.setPriority(int값) 을 통해 우선순위 설정함 - 그냥 Main에서 하면 됨!-> 이때 1~10 지정 가능
• 정의되어 있는 우선순위 상수
- MIN_PRIORITY: 1
- NORM_PRIORITY: 5 (default임!)
- MAX_PRIORITY: 10
(단지 우선순위가 높은 스레드는 우선순위가 낮은 스레드보다 좀 더 많이 실행 큐에 포함되어, 좀 더 많은 작업 시간을 할당받을 뿐임 )
Syschronization (동기화)
동기화-> 다중 thread에 의한 공유 자원 접근을 제어할 수 잇당 (-> thread 간섭 방지, 일관성 문제 방지, 데이터 변형 방지 를 해준당)= 여러 스레드가 동일한 리소스에 접근할때 걸어준다. 하나의 스레드만 한번에 한 리소스 사용할 수 있도록
race condition 문제 ! 여러 thread가 공동의 자원에 접근할 때 예측불가한 문제가 생길 수 ㅣㅇㅆ느 ㄴ것
원래 multiThreading -> 비동기 ! -> 필요할 경우 강제로 사용함 synchronized 키워드 사용- method에서 void앞에 적어둠- 함수안에서 동기화 할 부분에 synchronized(this){ ~~ } 해도 됨
동기화 동작
- Thread가 동기화된 메소드 실행하면 자동으로 해당객체(사용하는 자원)에 대한 lock을 획득
- 메소드 끝나면 lock 해제
- 동시간에 하나의 thread에만 lock가질 수 ㅇ
-한번에 하나의 thread만 객체에 대한 작업을 수행할 수 있도록 함
- 여러 thread가 객체에 접근하려할 때 동기화는 일관성을 유지하는데 도움줌!
동기화시 필요한 것
- synchronized 키워드
- wait() : 스레드를 blocked상태로 전환함 (=lock해제) 이제 잠들러가는 것. 해당 스레드 멈춤
- notify() / notifyAll() : 스레드를 active상태로 전환. all은 전부고, all없는건 아무거나 함 -> 걍 notifyAll하기
'2-1 > 객체지향 - java' 카테고리의 다른 글
14- ArrayList , Generics (0) | 2022.06.13 |
---|---|
Interfaces and Inner Classes (0) | 2022.06.02 |
Chap 9. Exception handling (0) | 2022.05.30 |
Polymorphism and abstract classes (0) | 2022.04.20 |
Chap 7. Inheritance (상속) (0) | 2022.04.12 |