본문 바로가기

Study/Java

[java] 스레드, 소켓

멀티스레드(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