Java 교육 Step4(스레드 스트림과 FileI/O)
1. 스레드(Thread)
1. 기본개념
1.1 용어
Tread의 용어는 '실' -> 일단 떠올라야되는게 동시실행이다
기본개념확인
- 프로그램 : 하드 디스크상에 저장된 소프트웨어
- 프로세스 : 메모리에 들어가 실행되는 프로그램
- 스레드 : 실행중인 프로세스의 작업(단위) 단위
하나의 실행 main 스레드라 부른다.
main() -> a호출 -> a실행 -> b호출 -> b실행 -> b종료-> a복귀 -> a종료 -> main복귀 -> main종료
1.2 자바 메모리의 구성
1.2.1 메서드 영역(Method Area)
static 변수와 메서의 바이트 코드가 들어간다. 스레드가 공유된다
1.2.2 스택영역(Stack Area)
지역변수가 저장된다. 스레드가 공유안된다.
1.2.3 힙영역(Heap Area)
인스턴스가 저장이 된다. 이영역은 가지지 컬렉션의 대상이된다. 힙은 각 스레드가공유한다.
2. 스레드
2.1 기본내용
실의 길이에 따라 수행시간 그치만 빠르게 오답 또는 굉장히 느리게 정답을 출력함
start는 코딩상이 아니라 동시 실행 -> cpu를 선점한다 어떤놈이 먼저인지 모름
실행순서가 모름 즉 개발자입장에서 제어가 안된다 그래서 프로그램이 아니다?
getName() -> 가상머신이 이름을 가져온다
sleep을 통해 살짝 제운다 안그러면 안놓는다. ->말로만동시? 형광등 깜박임
2.2 문법
- Thread 클래스를 상속받는 방법
- Runnable 인터페이스를 구현
2.2.1 Thread 클래스의 상속
Thread를 상속받아 run() 실행 -> run method가 스레드의 main이다
2.2.2 Runnerable 인터페이스 구현
Runnable인터페이스는 생성하고 Thread를 생성후 Thread의 run메서드를 실행
2.2.3 라이프 사이클
참고)
java1.0부터 있었음
동시실행 1core에서는 multi Thread 는 안된다.
패러럴 컴퓨터
3. 동기화(Synchronized)
3.1 동기화가 필요한경우(부제 : 굉장히 빠르게 오답이 나오는경우)
3.1.1 스레드가 공유하는 메모리
메모리 영영중 메서드, 힙영역을 공유
동시에 실행되는 스레드가 공유되는 인스턴스가 가지고 있는 변수에 동시에 접근하는 상황이 발생된는데 이상황이 잘못된 결과를 만들수 있다
메모리 3개(큰방) : 메서드(static), 스택(로칼 -모든 프로그램에 다 있고 반환됨), 힙(인스턴스- 데이터만)
※ 스레드에서 힙에 올라간 데이터를 공유를 하는데 이게 문제
※ join메서드는 같이 가는게 문제 아니라 같이 끝난다
3.2 동기하기반 메서드(부제:굉장히 느리게 정답이 나오는경우)
3.2.1 동기화메서드 & synchronized 기반 동기화 블록
synchronized 이거 쓰면 된다 근데 늦다 => synchronized 기반 동기화 블록
3.3.2 스레드의 블록킹 단위
메서드 만이 아니라 메서드가 속해있는 인스턴스 전체가 블록킹 된다.
synchronized : 블록이라 생각하자 누가 잡으면 못들어감
모든 인스턴스는 열쇠? 스레드가 열쇠를 잡는 아이가 먼저 -> instance전체
=>결론 한줄서기임
3.3 개발자가 개입하는 동기화 기반 코딩기법
상황 T1이 변수 a를 변하는 동기화기반 메서드 m1,m2
T2가 변수 b를 변하는 동기화기반 메서드 m3,m4 인경우
각 인스턴스는 키를 하나씩 가지고 있다
실행중인 스레드는 인스턴스에 접근할때 키를 가지고 접근한다.
메서드안에는 동기화에 된 코드를 적을수 있는데 메서드 전체가 아니라 동기화 관련된것만 건다
열쇠는 Object로 생성
누가먼저는 모르지만 결과는 똑같이 하자!!! 그리고 컨트롤을 하자!!(우선순위가 무조건 앞뒤가 있을수 있다)
4. 순서제어
4.1 순서 문제에 대한 해결책
각각 다른기능의 thread를 제어해보자
Car Class에서 array로 제어
파는놈 사는놈 두개의 thread를 => 모든 스레드는 순서가 있고 제어하자
wait(); 실행중인 스레드를 blocking (일단쉬어) <-> sleep 특정시간동안 (알람이 없음)
notify() : blocking 메서드 하나만 실행
notifyAll() : blocking 메서드가 실행
ocjp -> ocjt(활주로 문제, 알파고 등등 스레드 필수) -- OS
2. 스트림(Stream)과 File I/O
Stream 강이아니라 물길정도 의미 : 데이터를 흐름 물길
이번장은 코드가 바뀜
- 자바는 입출력을 입출력 모델로 정의한다 -> 코드가 변한다
- 모든 스트림은 단방향이다
- 크게 'Byte Stream' 과 Char Stream 있다 => super class가 4개임(입/출력 분리)
- 반드시 IOException
Byte Stream Char Stream
최상위 InputStream Reader
OutputStream Writer
메서드는 read(), write()
생성자는 xxx최상위 클래스
EOF 상수이고 -1이다
표준입출력은 개발자가 건드리지 않는다(키보드/마우스) c에 f.open -> f는 format이다 point로 열기때문에
여기서는 스트림이 주인공이다 FIle은 도구이다
FileCopy 1byte로 조각낼때 짤림 누수
1. 기본개념
-1 은 EOF 상수값이다
1.1 용어
2. 바이트 스트림(Byte Stream)
2.1 기본개념
- 1 바이트 단위로 움직이므로 상당히 느리다
- 1 바이트 단위 움직이므로 데이터 깨짐 발생한다(소수,SizeOverFlow)
2.2 데이터 전송 속도가 느려지는 문제
문제를 처리하는 필터를 끼운다 FileInputStream - > BufferedInputStream
2.3 데이터가 깨지는 문제
DataInputStream DataOutputStream
추가적으로 type을 알려줘야됨 : wrtie -> writeInt wrtieDouble 등등
※ Java는 필터를 여러개 쓸수있다
DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));
안깨지고 빠르고
필터를 끼우는 순서는? 생성자안에 받을수 있는놈이 있는지 확인한다(즉 생성자를 열어봐야된다)
참고) java이후는 SizeOverFlow 발생된 데이터 순환된다 => C는 일부만
package day4.bytestream3;
public class SizeOverflow {
public static void main(String[] args) {
int a = 0; // byte로 변경시 결과가 다름 기본과정 첫날 기본사이즈
for (int i = 0; i < 300; i++) {
System.out.println(a++);
}
}
}
2.4 최종 해결방법
3. 캐릭터 스트림(Character Stream)
3.1 등장이유
- 자바 가상머신도 운영체제 앞에서는 하나의 응용프로그램이다
- 모든 운영체제가 같은 코드를 사용하지 않는다
java 문자는 2byte 유니코드인데 write할때 아스키로 변환(1byte)까지 해준다.
xml은 3byte, 언어마다 코드가 다름 또한 운영체제도 친화적이지 않음
운영체계에 따라 .. 해준다
3.2 Bufferedreader & BufferedWriter
BufferedWriter out.newLine() 메서드
3.3 PrintWriter (Char Stream 이다)
PrintWriter out.println(""), print, printf 메서드 ->서블릿에서 찍을때도 쓴다.
※ Sysout.out.println이것은 ByteStream 이다
4. 사용자 정의 필터 클래스
4.1 기본개념
4.2 사용방법
내가 만든 필터 마지막임(슈퍼클래스가 됨)
FilterInputStream 상속
read()
new String() -> Serialization에 참여됨
서버코드 <-> 클라이언트 => 네트워크 Java에서는 인스턴스 직열화
5. 객체 직렬화(Serialization)
VO 클래스로 처리해볼까?
5.1 기본개념
둘다 공통 약점 Byte Char -> 데이터이동시 VO로 보낼시(1개씩이 아니라) 객체 직렬화
5.2 직렬화 대상제외
보안상 특정항목을 지울때 transient -> 다른값으로 변경 불가
5.3Externalizable 인터페이스
5.3.1 writeExternal()
5.3.2 readExternal()