11월 28일 - java day07
오늘 할 것 :
파일 전송 서버
파일 전송 클라이언트
스레드 개념
소켓 통신에 스레드 적용
여러 클래스를 동시에 실행한다~
레이스 컨디션
싱클톤 - 멀티 스레드
멀티 스레드가 쓰이는 곳
하드 디스크에 저장된 프로그램
메모리에서 실행된 프로그램 : 프로세스
프로세스 1개에는 기본적으로 스레드가 1개 있음
쓰레드를 구현하는 방법 2가지
Thread 클래스를 상속받는 방법
Runnable 인터페이스를 구현하는 방법
스레드 : 코드를 순차적으로 실행하는 일꾼
여러 스레드를 이용해서 동시에 여러작업을 수행
장점: 작업 속도가 빨라짐. 비동기 작업 가능(ex.네이버메인에서 연관검색어 바뀌는동안 나는 검색가능)
단점: 컨텍스트 스위치가 많이일어나면(스레드를 왔다갔다 많이하면) 오히려 작업 속도가 느려질수도 있음.
동기화가 어려워짐.
스레드가 세이프하지 않을 수 있음(차례대로 작업한것과 스레드를 동시에 작업했을때 결과가 같지 않을 수 있다)
Runnable 인터페이스 구현체
balance 읽어서 값을 더하고 저장, 여러 스레드가 동시에 작업하면 레이스 컨디션 상태가 됨-> 실행 결과가 스레드 세이프하지 않음
레이스 컨디션 상태: 마치 경주하듯이 스레드를 동시에 작업하는데 결과가 스레드세이프하지 않을 때
Synchronized를 사용하면 여러 스레드가 동기화하면서 작업을 진행
(한 스레드가 값을 읽는동안 값에 락을 걸어서 다른스레드가 동시에 읽지 못하게함. 오히려 성능이 더안좋아질수도있음)
Synchronized : 락을 걸고 푸는 것. 2가지방식있음
지시어방식
블록방식
basic2/day07/MultiThreadServer.java
basic2/day07/MessageProcessThread.java
basic3/day07/MultiThreadClient.java
서버
메시지 메시지
클래스 클래스 클래스
서버가 메시지를 수신할 수 있는 스레드
서버 메시지 송신 스레드
서버 클래스(MultiThreadServer)
포트번호
서버 소켓
입출력 스트림
클라이언트 소켓들을 저장할 수 있는 변수(List로 하든 배열로하든 맘대루->List로 함)
메인
서버 실행
무한 반복
클라이언트 접속 허용 -> 클라이언트 소켓 생성
변수에 클라이언트 소켓 추가
클라이언트 메시지 처리 스레드 생성
소켓
생성자(소켓)
run 메소드 구현
무한반복
메시지 받아서 출력
스레드 실행
메시지 송신 스레드
메시지를 받는 코드를 무한 반복
메시지 수신 스레드
메시지를 보내는 코드를 무한 반복
클라이언트 클래스
메인
서버 주소
서버 포트 번호
소켓
메시지 송신 스레드 생성
메시지 수신 스레드 실행
메시지 송신 스레드 생성
메시지 수신 스레드 실행
무한 반복
메시지 클래스
메시지 타입
메시지
현재 시간