-
자바 개념 6(thread)학교 수업/자바프로그래밍 2020. 4. 23. 18:50
1:1 채팅프로그램이 아닌 다인원 채팅프로그램을 구현하려면
서버가 여러 클라이언트와 통신하면서 요청을 처리하기 위해 필요한 쓰레드에 대해 알아야한다.
(
서버&클라이언트 1:1이면 thread사용 불필요
but 서버 & 클라이언트1 & 클라이언트2 & 클라이언트3... 이면 thead사용해야함
)
그래서 therad란 무엇인가?
thread 쓰레드
- 개념 : 하나의 프로세스 내부에서 독립적으로 실행되는 하나의 작업 단위
세부적으로는 운영체제에 의해 관리되는 하나의 작업 혹은 태스크를 의미
프로세스(Process) : 실행중인 프로그램,
프로그램을 실행하면 OS로부터 실행에 필요한 자원(메모리)을 할당받아 프로세스가 된다.
그림으로 자세히 보자면
- 쓰레드의 생명 주기
1. Runnable (준비상태)
스레드가 실행되기 위한 준비단계
CPU를 점유하고 있지않으며 실행(Running 상태)을 하기 위해 대기하고 있는 상태
코딩 상에서 start( ) 메소드를 호출하면 run( ) 메소드에 설정된 스레드가 Runnable 상태로 진입
“Ready“ 상태라고도 한다
2. Running (실행상태)
스케줄러에 의해 선택된 스레드가 CPU를 점유하여 실행하고 있는 상태이며 run() 메서드는 JVM만이 호출 가능
Runnable(준비상태)에 있는 여러 스레드 중 우선 순위를 가진 스레드가 결정되면 JVM이 자동으로 run( ) 메소드를 호출하여 스레드가 Running 상태로 진입
3. Dead (종료상태)
Running 상태에서 스레드가 모두 실행되고 난 후 완료 상태
“Done” 상태라고도 한다
4. Blocked (지연 상태)
CPU를 점유권을 상실한 상태 -> 스레드가 작업을 완수하지 못하고 잠시 작업을 멈추는 단계
후에 특정 메서드를 실행시켜 Runnable(준비상태)로 전환한다.
wait( ) 메소드에 의해 Blocked 상태가 된 스레드는 notify( ) 메소드가 호출되면 Runnable 상태로 간다.
sleep(시간) 메소드에 의해 Blocked 상태가 된 스레드는 지정된 시간이 지나면 Runnable 상태로 간다.
- 자바에서 쓰레드 구현 방법
1. Thread 클래스를 상속
2. Runnable 인터페이스를 구현
→ thread 클래스를 상속받으면 다른 클래스를 상속 받을 수 없기 때문에, Runnable 인터페이스를 구현하는 방법이 일반적.
1. Thread 클래스 상속받는 예시 코드
12345678910111213141516171819202122232425public class ThreadExam01 {public static void main(String[] args){MyThread01 m1 = new MyThread01("*");MyThread01 m2 = new MyThread01("+");MyThread01 m3 = new MyThread01("#");m1.start();m2.start();m3.start();System.out.println("main메소드 종료.");}}class MyThread01 extends Thread{private String str;public MyThread01(String str){this.str = str;}@Overridepublic void run() {for(int i = 0; i < 5; i++)System.out.print(str);}}cs 2. Runnable 인터페이스를 이용해서 구현하는 코드 예시
12345678910111213141516171819202122232425262728293031323334public class ThreadExam02 {public static void main(String[] args){Runnable r1 = new MyThread02("*");Runnable r2 = new MyThread02("%");Runnable r3 = new MyThread02("#");//Thread t1 = new Thread(new MyThread02("*"));Thread t1 = new Thread(r1);Thread t2 = new Thread(r2);Thread t3 = new Thread(r3);t1.start();t2.start();t3.start();System.out.println("main메소드 종료.");}}class MyThread02 implements Runnable{private String str;public MyThread02(String str){this.str = str;}@Overridepublic void run() {for(int i = 0; i < 5; i++)System.out.print(str);}}/*[실행결과]*****#####+++++main메소드 종료.*/cs 두 방법 모두 공통적으로는 run()메소드를 상속받아서 오버라이딩 해줘야하며,
쓰레드 작업을 해줄 곳에 start()호출해 줘야 한다.
start()호출하면 thread 실행 준비 완료 -> run() 실행시 thread 가 실행
이 thread 개념을 이용해서
서버에서 하나의 클라이언트가 아닌 여러 명의 클라이언트가 접속 요청을 할때,
각 클라이언트와 통신하기 위해 클라이언트마다 새로운 스레드를 생성해서 멀티스레드로 운영한다.
멀티태스킹과 멀티쓰레딩
멀티태스킹(Multi-tasking, 다중작업) : 여러 개의 프로세스가 동시에 실행
멀티스레딩(Multi-threading) : 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행- 멀티스레딩의 장점
① CPU 사용률을 향상
② 자원을 보다 효율적으로 사용 가능
③ 사용자에 대한 응답성이 향상
④ 작업이 분리되어 코드가 간결
- 멀티스레딩의 단점
: 여러 쓰레드가 같은 프로세스 내에서 자원을 공유하면서 작업을 하기 때문에 발생할 수 있는
동기화(synchronization ) = 트랜잭션, 교착상태(deadlock)와 같은 문제들을 고려하며 프로그래밍 해야 한다.
'학교 수업 > 자바프로그래밍' 카테고리의 다른 글
자바 개념 5(socket programming의 바탕 TCP/IP) (0) 2020.04.23 자바 개념 4 (입출력) (0) 2020.04.18 자바개념3 (상속) (0) 2020.04.16 자바 개념2 (클래스, 필드, 메소드, 제어자) (0) 2020.04.16 자바 개념 (0) 2020.04.16