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