-
자바의 정석 공부 - 프로세스와 쓰레드(작성중)코딩공부/자바 2023. 6. 8. 21:02
프로세스: 실행 중인 프로그램 - 자원(메모리,cpu ,...)/ 쓰레드로 구성
쓰레드: 프로세스 내에서 실제 작업을 수행
모든 프로세스는 최소한 하나의 쓰레드를 가지고 있다.
프로세스 = 공장 / 쓰레드 = 일꾼
싱글 쓰레드 프로세스: 자원 + 쓰레드
멀티 쓰레드 프로세스: 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드 -> 대부분의 프로그램
(요청마다)하나의 새로운 프로세스를 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 더 적은 비용이 듦 (전자:CGI, 후자: Java Servlet) -> 자바인기
멀티쓰레드 장점
- 시스템 자원을 보다 효율적으로 사용 가능
- 사용자에 대한 응답성이 향상
- 작업이 분리되어 코드가 간결해짐
멀티쓰레드 단점 -> 공유에서 발생
- 동기화에 주의해야 한다
- 교착상태(dead-lock)가 발생하지 않게 주의해야 함
- 각 쓰레드가 효율적으로 고르게 실행될 수 있게 해야함
- 기아- 어떤 쓰레드는 자원을 할당받지 못함
- -> 고려할 사항이 많다
쓰레드의 구현과 실행
- 1. Thread 클래스 상속
- 쓰레드클래스를 상속한 클래스의 객체 생성 -> 객체.start() : 쓰레드의 실행
Class MyThread extends Thread { public void run() {} }
MyThread t1 = new MyThread(); //쓰레드 생성 t1.start(); //쓰레드 실행
- 2. Runnable 인터페이스를 구현 -> 추천 (sort와 유사 -> 이게 뭐지? 공부할 것)
- 메서드의 구현체를 외부에서 매개변수로 받음
class MyThread2 implements Runnable { public void run() }
Runnable r = new MyThread2(); Thread t2 = new Thread (r); t2.start();
예시 코드
public class Ex13_1 { public static void main(String[] args) { ThreadEx1_1 t1 = new ThreadEx1_1(); Runnable r = new ThreadEx1_2(); Thread t2 = new Thread(r); t1.start(); t2.start(); } } class ThreadEx1_1 extends Thread { public void run() { for(int i = 0; i < 5; i++){ System.out.println(getName()); } } } class ThreadEx1_2 implements Runnable { public void run() { for(int i = 0; i < 5; i++){ System.out.println(Thread.currentThread().getName()); } } }
getName()은 this.getName()과 같음 (상속받은 것), Runnable을 구현한 클래스에서는 Thread.currentThread().getName()으로 작성 (쓰레드를 참조해야 함)
쓰레드를 생성한 후에 start()를 호출해야 쓰레드가 작업을 시작함(작업 대기 상태) -> OS 스케줄러가 실행순서 결정 (먼저 start()를 했다고 먼저 실행되지 않음) : OS에 종속적
start()메서드: mian()메서드에서 start()호출 -> start()가 새로운 호출 스택 생성 -> 새 스택에 run()을 올리고 종료 => 각각의 스택에서 main()과 run()이 서로 독립적으로 작업수행
main쓰레드: main메서드의 코드를 수행하는 쓰레드
쓰레드의 두 종류: 사용자 쓰레드 / 데몬 쓰레드(보조 쓰레드) -> 실행 중인 사용자 쓰레드가 하나도 없을 때 프로그램 종료
예제 코드
public class Ex13_11 { static long startTime = 0; public static void main(String[] args) throws InterruptedException { ThreadEx11_1 th1 = new ThreadEx11_1(); ThreadEx11_2 th2 = new ThreadEx11_2(); th1.start(); th2.start(); startTime = System.currentTimeMillis(); try{ th1.join(); th2.join(); }catch (InterruptedException e){} System.out.println("소요시간" + (System.currentTimeMillis() - startTime)); } } class ThreadEx11_1 extends Thread { public void run () { for(int i = 0; i < 300; i++){ System.out.print(new String("-")); } } } class ThreadEx11_2 extends Thread { public void run() { for(int i = 0; i < 300; i++){ System.out.print(new String("|")); } } }
th1.join(); : main 쓰레드가 th1의 작업이 끝날 때까지 기다림
main쓰레드가 종료되었다고 프로그램이 종료되는 것은 아님
싱글쓰레드
- 순차적으로 작업 실행
멀티쓰레드
- 시간과 순서를 OS스케줄러가 결정 -> 작업 순서가 섞임
- 작업에서 다른 작업으로 넘어갈 때 (context switching) -> 시간이 더 걸림
- 동시에 서로 다른 작업할 수 있음
- 작업을 좀 더 효율적으로 할 수 있음
쓰레드의 I/O블락킹
입출력 시 작업 중단
'코딩공부 > 자바' 카테고리의 다른 글
java 문법 종합반 5주차 (0) 2023.05.31 JAVA 문법 종합반 4주차 (1) 2023.05.26 java 문법 종합반 3주차 (0) 2023.05.24 java 문법 종합반 2주차 (0) 2023.05.23 java 문법 종합반 1주차 (2) 2023.05.22