*스레드 (Thread)

 

- 프로그램을 구성하는 명령문은 순서대로 하나씩 처리 되는것이 기본이다.

  조건문,반복문,메소드 호출문으로 복잡하게 얽혀있는 프로그램도 명령문이 실행되는 순서를

  따라가다보면 길게 연결된 한 가닥 실과 같은 흐름이 있다.

  이런 실행 흐름을 스레드(Thread)라고 부른다.

 

- 스레드 객체는 한번만 사용이 가능하다.

 

 

 

#싱글 스레드 (Single Thread)

 

- Single Thread 프로그램 스레드는 main 메소드의 첫번째 명령문부터 시작되고

  main 메소드의 마지막에 도달하거나 return문을 만나면 끝이난다.

 

 

 

 

 

#스레드 구현 Runnable 인터페이스 활용

 

- 클래스에 상속받아 구현하는것이 아닌 Ruunable 인터페이스를 사용해 구현

 

- 특정 기능이 있는 클래스를 상속받아 사용해야 하는데 그 기능을 스레드로 돌리고 싶을때 사용

 

 

 

 

#스레드간의 커뮤니케이션

 

- 공용데이터를 만들어 그 플래그 값을 기준으로 프로세스 진행을 제어하는 방법

 

 

 

 

- 자바의 컴파일러는 프로그램 성능 향상을 위해서 값을 바꾸지 않고 반복해서

  체크할 경우 그 값을 한번 가져다 놓고 여러번 사용하기 때문에 위의 예제에서는

  문제가 된다.

  그럴경우에 최적화 없이 항상 가져다 체크하도록 명령을 내리는 volatile명령어를 쓰면 된다.

 

 

 

 

 

#2개의 쓰레드를 활용하여 캐릭터끼리 공격과 방어를 하는 게임만들기

 

- 영단어는 랜덤으로 나옴 영어 스펠링을 맞추면 공격 스펠링이 틀리면 상대방 체력증가

 

- 방어 턴일 때는 에너지 증가

 

- 상대방 에너지가 0이 되면 승리

 

 

 

 

 

#황금알 낳는 거위 프로그램 만들어보기

 

- 황금알을 낳는 클래스가 있다. 이 거위는 1초마다 알을 1개씩 낳는다.

 

- 엔터키를 입력하면 거위를 우리 밖에 꺼내놓고  그동안 낳은 알을 모두 가져온다. 모두 가져오는 시간은 3초걸린다.

 

- 알을 가져오는 동안은 거위는 밖에 있으므로 알을 낳지 않는다.

 

 

 

 

 

 

#스레드 구현 커뮤니케이션2

 

- 스레드끼리 신호를 직접적으로 주고 받는 방법으로 공유 객체를 통해서 notify와 wait로 연락을

  주고 받을 수 있다.

 

- 스레드는 공유 객체에서 wait메소드를 notify가 올 때까지 대기 상태가 된다.

 

- 다른 스레드는 먼저 끝내야 할 작업을 끝낸 후 공유 객체를 통해서 notify메소드를 호출해주면 

  wait 하고 있던 상대방 스레드는 다시 작동을 하게 된다.

 

 

 

#이전에 플래그 값을 세워서 동기화를 구현했던 예제에서 notify와 wait를 구현해보자

 

- isDone값을 한번 체크하고 루프를 돌면서 또 체크 하지말고 wait로 다른 스레드에서 결과가

  끝나고 호출을 보내주기를 기다린다. (동기화 처리 필요)

 

- 작업이 끝난 후에 notify로 작업이 끝났다고 notify를 날려서 wait 대기 중인 스레드를 다시 실행하도록 한다.

  (동기화 처리 필요)

 

 

  

 

#스레드를 총합적으로 복습해보자

 

- 단어장 배열에 10개의 단어가 있으며 0~9번까지 배열을 돌면서 각 문제를 가져와

  문제를 보여준다. 단, 한번은 영어를 보여주고 한글뜻을 입력하고 한번은 한글을 보여주고

  영어 철자를 입력하는 프로그램이다.

 

- 문제를 푸는동안 2개의 스레드가 돌아간다.

 

-> 한글을 풀때 시간을 체크하는 스레드

-> 영어를 풀때 시간을 체크하는 스레드

 

- 모든 문제를 풀고 나서 각각 소요된 시간 결과를 보여준다.

 

'Java > Java2' 카테고리의 다른 글

Java [Canvas,Swing]  (0) 2017.09.30
Java [자료구조]  (0) 2017.09.24
Java [예외처리,직렬화]  (0) 2017.09.18
Java [Object,Inner 클래스]  (0) 2017.09.16
Java [Gregorian Calendar,Math,Wrapper]  (0) 2017.09.14

+ Recent posts