<프로세스와 쓰레드>
프로세스 : 실행 중인 프로그램
ㄴ 프로그램을 수행하는 데 필요한 데이터, 메모리 등의 자원과 쓰레드로 구성됨
모든 프로세스에는 하나 이상의 쓰레드가 존재함, 둘 이상이면 멀티쓰레드
<멀티쓰레드의 장단점>
장점
1.CPU 사용률 향상
2. 자원을 보다 효율적으로 사용률
3. 사용자에 대한 응답성 향상
4. 작업이 분리되어 코드 간결
단점
1.동기화 해줘야 함
2.교착 상태 일어남
<쓰레드 구현과 실행>
1.Thread 클래스 상속 //Thread 클래스의 run() 오버라이딩
2.Runnable 인터페이스 구현 // run() 구현
ㄴ 다중 구현(상속) 가능하니 이거 권장
상속의 경우
ThreadEx1 t1 = new ThreadEx1() //객체 생성하면 OK
구현의 경우
Thread t2 = new Thread(new ThreadEx2()) //Thread 생성 시에 구현 인터페이스 넣음
<실행> start()
바로 실행되는 것이 아니라 "실행대기" 상태 //차례가 되면 호출
한번 종료된 쓰레드는 다시 실행 불가 //다시 객체 생성 해줘야 함
그런데, 메소드 run()을 구현했는데 왜 start()로 실행하죠???
1.start()가 쓰레드를 위한 새 호출 스택을 생성함
2.그 호출스택에서 run()이 수행(되면 start()는 수행 종료)
<main 쓰레드> 사실 쓰레드가 main메서드를 호출한 것!
멀티쓰레드라면, main 수행이 종료되어도 다른 쓰레드가 동작 가능함
- 실행 중인 "사용자 쓰레드"가 하나도 없을 때 프로그램은 종료됨
<싱글쓰레드와 멀티쓰레드>
싱글쓰레드:하나가 마치면 나머지가 수행
멀티쓰레드:번갈아가면서 수행
작업 전환에 시간이 더 추가되어, 싱글 코어에서 CPU만 사용하는 계산이면 싱글쓰레드가 효율적
멀티코어면 쓰레드 작업 겹칠 순 있음(싱글 코어는 안 겹침)
<쓰레드의 IO블락킹> - 두 쓰레드가 서로 다른 자원들 사용하는 작업
싱글쓰레드 : 입력을 기다리는 동안 수행 못함
멀티쓰레드 : 입력을 기다리는 동안 다른 작업 수행
<쓰레드의 우선 순위> - 작업 중요도에 따라 1~10
void setPriority(int a) //쓰레드 우선 순위 변경
int getPriority //우선순위 몇인지 반환
근데 꼭 반영되는 건 아니고 "참고"만 됨
<쓰레드 그룹> - 서로 관련된 쓰레드 묶기//다른 쓰레드는 변경 불가
폴더 안에 폴더 넣듯이, 쓰레드 그룹에 다른 쓰레드 그룹 포함 가능
Thread(ThreadGroup group, String name...)등등
<데몬 쓰레드> 보조 쓰레드
일반 쓰레드가 종료되면 데몬 쓰레드도 함께 종료(GC,자동저장,자동갱신..등에 사용)
ㄴ 무한루프+조건문 이용해서 대기->조건 만족되면 실행->다시 대기
boolean isDaemon() 데몬 쓰레드인지 확인
void setDaemon(boolean on) true 하면 데몬쓰레드, fasle는 사용자 쓰레드로 변경
ㄴ데몬쓰레드가 생성한 쓰레드는 전부 데몬임
<쓰레드의 상태>
NEW 쓰레드 생성후, start() 호출 전
RUNNABLE 실행중 or 실행가능상태
BLOCKED 동기화 블럭에 의해 일시정지(lock풀릴 때까지 기다림)
WAITING 작업 종료는 아니지만, 일시정지 상태(실행가능X)
TIMED_WAITING 일시정지 시간이 지정된 경우
TERMINATED 작업 종료
<쓰레드의 실행 제어>
sleep(long millis)내가 주어진 시간동안 잠듬,interrupted() 호출되면 중간에 깸(예외처리 필수)
ㄴ 이거 중간중간 써주면 메모리 덜 차지해서 좋음
interrupted() 작업 끝나기 전에 취소시킴(요청함) false -> true로 변경
ㄴ isInterrupted() 쓰레드의 현재 상태 반환(작업 멈춰있음?)
ㄴ interrupted() 쓰레드의 현재 상태 반환 후, false로 변경
join() 다른 쓰레드 작업 기다림(시간 지정안하면 끝날 때까지 기다림)
yeild() 나한테 주어진 실행 시간을 다음 쓰레드에게 양보
suspend() 정지 resume() 일시정지품 stop() 종료
ㄴ deprecated 사용권장XXX 교착상태 일으킬 가능성 높음
<쓰레드 동기화> - 임계영역 //락
임계 영역 코드 설정 후, 객체가 가진 lock을 획득한 "하나"의 쓰레드만 수행가능하게 함
ㄴ 모두 수행하고 lock 반납해야 다른 쓰레드가 다시 lock 획득해서 코드 수행 가능
쓰레드의 동기화?
ㄴ 한 쓰레드가 진행중인 작업을 다른 쓰레드가 간섭 못하게 막음
<synchronized로 동기화>
1. 메서드 전체 설정
public synchronized void calcSum() { 임계영역(메소드 전부) }
2.특정한 영역 설정 <-효율 높음
synchronized(객체 참조변수) { 임계영역 }
<wait()과 notify()>
한 쓰레드가 lock을 보유한 채로 오래 보내면, 다른 작업이 원활하지 않음
wait() 임계영역 수행 중, 진행할 상황이 아니면 lock반납 후 기다림
notify() 작업을 진행할 수 있는 상황이 되면, 작업 중단한 쓰레드가 다시 락 가지고 작업
nofifyAll() 대기인원 전부한테 알림
꿀팁 : wait() 다음에 sleep(아주잠깐)이라도 써주면 메모리 덜 차지해서 성능 UP
Network
내 컴퓨터와 상대 컴퓨터를 연결
API 형태를 적용해서 쓸 수 있다
(TCP/IP)
ㄴ 세팅이 다 되어있을 때 www
서버-클라이언트 구성
서버:서비스를 제공하는 쪽
클라이언트:사용자
서버
서버소켓-port번호(전화번호)
서버소켓억셉트-접근허용
소켓 - getInputStream, getOutputStream
read - write 안씀 채팅에서, 속도느림
InputStreamReader 씀
close
클라이언트
소켓을 바탕으로 사용자(ip, port)로 접근
Server에서 데이터를 전송받아 자신의 콘솔창에 ip와 메세지 출력
Server는 다수의 클라이언트 메세지를 받기 위해 accept()와 메세지를 읽는
로직을 반복해야 한다 -> 동시 수행이 아님
Client는 서버로 데이터를 한번 전송하고 완료한다
서버 먼저 실행하고, 그 다음에 클라이언트 실행
카테고리 없음
국비학원 14일차) 쓰레드, 네트워크
728x90