멀티스레드(Multi-Thread)
- 스레드 : 프로그램의 실행 흐름
꼭 run() 메소드를 써줘야한다.
run()메소드 안에 스레드가 해야할 일을 넣어준다.
- 싱글스레드 : 스레드가 하나뿐인 프로그램
작동 방식 : 스레드의 시작 -> 스레드의 끝
작성 방법 : java.lang.Thread 클래스
- 멀티스레드 : 스레드가 둘 이상인 프로그램. 스레드를 더 많이 사용하는 만큼 우선 순위를 정한다.
작동방식 : 1번 스레드 시작 -> 2번 스레드 시작 -> 1번 스레드 끝 -> 3번 스레드 시작 -> 2번 스레드 끝 -> 3번 스레드 끝
작성 방법 : java.lang.Ruunable 인터페이스
스레드를 생성하는 부분은 어렵지 않다. 그러나, 통제하는 부분이 어렵다
*Ruunable : start
*NotRuunable : sleep
- 그냥 Thread 사용할 때, Runnable 인터페이스를 사용할 때
public class DigitThread implements Runnable {
//public class DigitThread extends Thread
//Thread에 꼭 필요한 메소드
public void run() {
for(int cnt=0;cnt<10;cnt++) {
System.out.print(cnt);
try {
//아무 일도 안하고 주어진 시간이 경과되길 기다리는 메소드
Thread.sleep(1000);
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String[] args) {
//객체 생성
DigitThread dt = new DigitThread();
//Thread thread = new DigitThread();
//스레드 생성
Thread thread = new Thread(di);
thread.start();
for(char ch='A';ch<'Z';ch++) {
System.out.print(ch);
try {
//아무 일도 안하고 주어진 시간이 경과되길 기다리는 메소드
thread.sleep(1000);
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
스레드 간의 데이터 교환
- 작동방식 : 1번 스레드의 시작 -> 2번 스레드의 시작 -> 1번 스레드의 계산 -> 1번 스레드의 공유영역의 계산 결과를 쓴다 -> 2번 스레드가 공유영역의 데이터를 읽는다. -> 1번 스레드의 끝 -> 2번 스레드가 데이터를 출력한다. -> 2번 스레드의 끝
- 공유영역을 따로 클래스 해줘야한다.
for문을 너무 많이 돌리면 Thread에서 for문의 권한을 뺏어가서 null값이 출력된다.
이런 경우를 방지하려면 critical section 동기화를 사용.
Critical Section
- 스레드 실행 중에 다른 스레드로 제어가 넘어가 문제를 일으킬 수 있는 부분. 주로 공유 데이터를 사용
Critical Section의 동기화
- 공유 데이터 사용 중에 그 공유 데이터를 다른 스레드가 사용하지 못하도록 만드는 것
- 자바 가상 기계(JDK)에선 동기화 블록을 구분하기 위해 공유 객체를 사용한다. <같은 공유 객체에 대한 동기화 블록은 서로 중첩되지 않게끔 스케쥴(소스)을 조정한다>
Notify & Wait
- 이 호출문들은 동기화 블록이나 동기화 메소드 안에 있어야 한다.
Wait - 스레드에서 멈추라는 메소드
Notify - 스레드에서 신호를 보내라는 메소드
NotifyAll - wait하고 있는 모든 스레드에게 신호를 보내는 메소드
socket
- 통신 연결할 때 쓰는 것
- 서버소켓 생성방법
ServerSocket serverSocket = new ServerSocket(9000);
//서버 소켓으로 연결 요청이 들어오면 연결 맺고 클라이언트 소켓을 생성해서 리턴하는 메소드. 제일 먼저 반응하는 메소드
Socket socket = serverSocket.accept();
- 클라이언트 소켓 생성방법
Socket socket = new Socket("127.0.0.1", 9000);
- 입출력스트림을 통해서 소켓에 있는 데이터들을 주고받고한다.
//데이터 수신에 사용할 입력 스트림 객체를 리턴
InputStream in = socket.getInputStream();
//데이터 송신에 사용할 출력 스트림 객체를 리턴
OutputStream out = socket.getOutputStream();
'Study > Java' 카테고리의 다른 글
[java] JAVA 꼭 알아야할 것 (0) | 2019.05.15 |
---|---|
[java] 스레드, 소켓 실습 (0) | 2019.05.15 |
[java] Input, Output 실습 (0) | 2019.05.15 |
[java] Input, Output (0) | 2019.05.15 |
[java] 클래스와 자료구조 실습 (0) | 2019.05.15 |