자바네트워크 제2주 실습 네트워크기초, 스레드
스레드 이번 주의 프로젝트는 Chap02 로 한다 모든 프로그램은 Chap02 프로젝트에 새 클래스 로 작성한다. 모든 클래스는 패키지를 jnp.y2012 로 한다.
Chap02 프로젝트 생성 프로젝트명 입력 Chap02
Chap02 프로젝트 생성 빈 프로젝트 생성됨
예제 2-1 실습 Thread 클래스를 상속받은 클래스로 스 레드 구성 한 파일에 두 개의 클래스 선언 스레드가 하는 일은 단순히 화면에 문 장을 출력하는 것이다.
실행 클래스 추가 1
실행 클래스 추가 2 패키지명 jnp.y2012 클래스명 ExtendThreadTest 실행파일 조건
Thread를 상속받는 private 클래스 선언 3번~5번 줄 직접 입력 public class … 로 되어 있지 않고 class … 로 되어 있는 것은 이 클래스는 현재 파일 (ExtendThreadTest.java)에 있는 클래스들만 사용할 수 있는 private 클래스란 의미이다. public class … 형식으로 정의된 클래스는 반드시 클래스명과 파일 명이 일치해야 한다.
run 함수 구현 오른버튼 클릭 구현가능한 함수 중에 run 선택 주석 추가
생성된 코드 자동으로 추가된 주석 자동으로 구현된 run 함수
run 함수 수정 자동으로 추가된 super.run() 을 지우고 화면에 “Thread 클래스를 상속” 이라고 출력하는 문장을 삽입
main 함수 수정 Thread 인스턴스를 생성하고 start를 호출하여 스레드가 시작하도록 한다 run 이 종료하면 자동으로 Thread는 소멸한다.
예제 실행 오른버튼 클릭 실행 결과
예제 2-2 실습 Runnable 인터페이스를 구현한 클래스 로 스레드 구성 한 파일에 두 개의 클래스 선언 스레드가 하는 일은 단순히 화면에 문 장을 출력하는 것이다.
실행 클래스 추가 1
실행 클래스 추가 2 패키지명 jnp.y2012 클래스명 RunnableThreadTest 실행파일 조건
Runnable을 구현하는 private 클래스 선언 3번~5번 줄 직접 입력 public class … 로 되어 있지 않고 class … 로 되어 있는 것은 이 클래스는 현재 파일 (RunnableThreadTest.java)에 있는 클래스들만 사용할 수 있는 private 클래스란 의미이다. public class … 형식으로 정의된 클래스는 반드시 클래스명과 파일 명이 일치해야 한다.
구현가능한 함수 중에 run 선택 run 함수 구현 오른버튼 클릭 주석 추가
생성된 코드 자동으로 추가된 주석 자동으로 구현된 run 함수
run 함수 수정 화면에 “Runnable 인터페이스를 구현” 이라고 출력하는 문장을 삽입
main 함수 수정 Thread 인스턴스를 생성하고 start를 호출하여 스레드가 시작하도록 한다 run 이 종료하면 자동으로 Thread는 소멸한다.
예제 실행 오른버튼 클릭 실행 결과
예제 2-4 실습 Runnable 인터페이스를 구현한 클래스 로 스레드 구성 한 파일에 두 개의 클래스 선언 스레드가 하는 일은 단순히 화면에 문 장을 출력하는 것이다. 플래그를 확인하여 스레드를 종료 시 킨다. run 함수에서 항상 플래그를 체크하도 록 한다.
실행 클래스 추가 1
실행 클래스 추가 2 패키지명 jnp.y2012 클래스명 StopThreadTest 실행파일 조건
Runnable을 구현하는 private 클래스 선언 3번~5번 줄 직접 입력 public class … 로 되어 있지 않고 class … 로 되어 있는 것은 이 클래스는 현재 파일 (StopThreadTest.java)에 있는 클래스들만 사용할 수 있는 private 클래스란 의미이다. public class … 형식으로 정의된 클래스는 반드시 클래스명과 파일 명이 일치해야 한다.
구현가능한 함수 중에 run 선택 run 함수 구현 오른버튼 클릭 주석 추가
생성된 코드 자동으로 추가된 주석 자동으로 구현된 run 함수
run 함수 수정 스레드가 스톱요청을 받았는지를 판단하는 프래그 변수 stopped가 false 이면 스레드가 스톱요청을 받았는지를 판단하는 프래그 변수 stopped가 false 이면 화면에 “Thread is alive…” 이라고 출력하는 문장을 0.5초 마다 계속하여 반복함. Thread.sleep 함수는 오류가 발생할 수 있으므로 try~catrch 로 오류 처리를 해준다. stopped가 true가 되면 while 문이 종료하고 스레드가 종료 한다.
외부 인터페이스 함수 stop 추가 23번~25번 줄 직접 입력 stop 함수는 public 함수 이므로 클래스 외부에서 호출이 가능하고 이 함수를 호출하면 stopped 를 true로 설정하므로 이 함수가 호출된 후에 run 에서 while 루프가 종료하여 스레드가 종료한다.
StopThreadTest에 process 함수 추가 37번~48번 줄 직접 입력 실제로 스레드를 생성하고 종료 테스트를 하는 process 라는 함수를 추가함. main에 직접 작성할 수 있으 나 main을 간단하게 하고 프로그램 가독성을 높이기 위하여 함수로 작성함.
main 함수 수정 프로그램의 시작을 알리는 문장을 출력한다. 실행 클래스 인스턴스를 생성한다. 실행 클래스의 process 함수를 호출한다. 실행 클래스 인스턴스를 생성하는 이유는 process 함수가 static이 아니고 main은 static 이기 때문이다. 거의 모든 Java 프로그램은 이러한 형식을 취하고 있다.
예제 실행 오른버튼 클릭 실행 결과
실행결과 설명 main함수에서 인스턴스를 생성하기 전에 출력 process 함수에서 StopThread를 생성하고 start 함수를 호출하여 StopThread의 run 함수에서 0.5초에 한번씩 출력한 문장 process 함수에서 스레드를 시작 시킨 후에 1초간 멈춘 후에 StopThread의 stop 함수를 호출하여 플래그를 true로 만들어서 run의 while 루프가 종료하여 스레드가 종료함.
예제 2-5 실습 Runnable 인터페이스를 구현한 클래스 로 스레드 구성 한 파일에 두 개의 클래스 선언 스레드가 하는 일은 단순히 화면에 문 장을 출력하는 것이다. interrupt를 호출하여 스레드를 종료 시 킨다. run 함수에서 interrupt 되었는지를 체 크한다.
실행 클래스 추가 1
실행 클래스 추가 2 패키지명 jnp.y2012 클래스명 StopThreadTest 실행파일 조건
Runnable을 구현하는 private 클래스 선언 3번~5번 줄 직접 입력 public class … 로 되어 있지 않고 class … 로 되어 있는 것은 이 클래스는 현재 파일 (AdvancedStopThreadTest.java)에 있는 클래스들만 사용할 수 있는 private 클래스란 의미이다. public class … 형식으로 정의된 클래스는 반드시 클래스명과 파일 명이 일치해야 한다.
구현가능한 함수 중에 run 선택 run 함수 구현 오른버튼 클릭 주석 추가
생성된 코드 자동으로 추가된 주석 자동으로 구현된 run 함수
run 함수 수정 Interrupt되지 않았으면 화면에 “Thread is alive…” 이라고 출력하는 문장을 0.5초 마다 계속하여 반복함. Interrupt 오류는 예상한 오류 이므로 아무 행동도 하지 않는다. Interrupt도 오류중의 하나 이므로 try~catrch 로 오류 처리를 해준다. 오류가 발생하던 하지 않던 실행되는 문장
AdvancedStopThreadTest에 process 함수 추가 36번~47번 줄 직접 입력 실제로 스레드를 생성하고 종료 테스트를 하는 process 라는 함수를 추가함. main에 직접 작성할 수 있으 나 main을 간단하게 하고 프로그램 가독성을 높이기 위하여 함수로 작성함.
main 함수 수정 프로그램의 시작을 알리는 문장을 출력한다. 실행 클래스 인스턴스를 생성한다. 실행 클래스의 process 함수를 호출한다. 실행 클래스 인스턴스를 생성하는 이유는 process 함수가 static이 아니고 main은 static 이기 때문이다. 거의 모든 Java 프로그램은 이러한 형식을 취하고 있다.
예제 실행 오른버튼 클릭 실행 결과
실행결과 설명 main함수에서 인스턴스를 생성하기 전에 출력 process 함수에서 AdvancedStopThread를 생성하고 start 함수를 호출하여 AdvancedStopThread의 run 함수에서 0.5초에 한번씩 출력한 문장 process 함수에서 스레드를 시작 시킨 후에 1초간 멈춘 후에 Thread의 interrupt 함수를 호출하여 스레드에서 Interrupt 오류가 발생하게 하여 while 루프가 종료하여 스레드가 종료함.
예제 2-6 실습 main 에서는 스레드를 생성하고 바로 프로그램을 종료한다. 스레드에서는 5초 정도 기다렸다가 종 료 한다. 스레드 클래스를 따로 정의하지 않고 바로 생성해서 사용한다.
클래스 생성 NormalThreadTest
main 함수 수정 스레드를 생성하면서 바로 run 함수를 구현하여 따로 클래스를 만들지 않고 사용함. 간단할 경우에는 유용한 방법임. 스레드가 시작하면 5초를 기다린 후 메시지를 출력함. main은 스레드를 시작하고 바로 종료함.
예제 실행 첫 줄의 문장을 main에서 출력한 후 약 5초 후에 스레드에서 둘 째 줄 문장을 출력한 후 프로그램이 종료 함.
예제 2-7 실습 main 에서는 스레드를 생성하고 바로 프로그램을 종료한다. 스레드에서는 5초 정도 기다렸다가 종 료 한다. 스레드 클래스를 따로 정의하지 않고 바로 생성해서 사용한다. 스레드를 데몬 스레드로 설정하여 실 행한다.
클래스 생성 DaemonThreadTest
main 함수 수정 스레드를 생성하면서 바로 run 함수를 구현하여 따로 클래스를 만들지 않고 사용함. 간단할 경우에는 유용한 방법임. 스레드가 시작하면 5초를 기다린 후 메시지를 출력함. 데몬으로 설정함 main은 스레드를 시작하고 바로 종료함.
예제 실행 첫 줄의 문장을 main에서 출력한 후 스레드가 종료하는 것을 기다리지 않고 프로그램이 바로 종료해서 스레드의 출력이 나타나지 않음.
예제 2-8 실습 main 에서는 스레드를 생성한다. 스레드에서는 5초 정도 기다렸다가 종 료 한다. 스레드 클래스를 따로 정의하지 않고 바로 생성해서 사용한다. 스레드를 데몬 스레드로 설정하여 실 행한다. 스레드의 종료를 확인 한 후에 main을 종료한다.
클래스 생성 ThreadJoinTest
main 함수 수정 스레드를 생성하면서 바로 run 함수를 구현하여 따로 클래스를 만들지 않고 사용함. 간단할 경우에는 유용한 방법임. 스레드가 시작하면 5초를 기다린 후 메시지를 출력함. 데몬으로 설정하여 시작함 main은 스레드가 종료한 것을 확인하고 종료함.
예제 실행 스레드가 5초 기다린 후에 문장을 출력하여 종료 한 후에 main에서 출력한 후 프로그램이 종료 한다. 데몬 스레드가 아니라고 같이 동작한다.
예제 2-9 실습 main 에서는 스레드그룹을 생성한다. 스레드 목록을 보여준다.
클래스 생성 ThreadGroupTest
main 함수 수정 main 스레드 정보 출력 main 스레드의 하위 그룹 생성 tg1의 하위그룹 생성 각 그룹에 스레드 생성 스레드 그룹 출력
예제 실행 스레드 그룹의 내용이 출력된다. 스레드를 3개 만들었지만 실제 활동 중인 스레드는 하나 밖에 없는 것을 알 수 있다.
예제 2-10 실습 main 에서는 스레드그룹을 생성한다. 스레드의 우선 순위를 설정한다.
클래스 생성 PriorityThreadTest
PriorityThread 추가 예제 2-5 참고하여 추가 현재 스레드의 우선 순위 출력
main 함수 수정 메시지 출력 스레드 생성 및 시작 스레드의 우선 순위를 바꾸어 본다. 스레드 종료
예제 실행 스레드의 우선 순위가 바뀌어 출력된 것을 알 수 있고 10인 경우에는 두 번 출력 된 것을 알 수 있다. 이는 우선 순위가 높기 때문에 main 보다 더 자주 실행이 되었기 때문이다.
예제 2-11 실습 ThreadLocal의 사용 예를 보여준다.
클래스 생성 ThreadLocalTest ThreadLocalTest {
ThreadLocal 및 static 함수 추가 필요한 값 출력 함수
main 함수 수정 메시지 출력 스레드 정의 및 생성 스레드 생성시마다 counter 증가 스레드 내에서 메시지 출력 임의의 시간 지난 후 다시 메시지 출력 스레드 3개 생성 및 실행
예제 실행 스레드로컬의 값이 main에서는 83 각 스레드에서는 각각 241, 960, 329 인 것을 알 수 있고 ThreadLocalObject 변수는 하나 이지만 각 스레드에서 값이 다르게 유지 됨을 알 수 있다. 하지만 counter 값은 모든 스레드에서 값이 같다.
예제 2-12 실습 멀티스레드의 생산자-소비자 구조에 대한 예를 실습한다
공동으로 사용할 Queue 인터페이스 인터페이스명 Queue 인터페이스 추가
생성된 Queue.java
Queue 코드 수정 6번~10번 줄 직접 입력 Queue 동작에 필요한 함수들을 정의 하는 것임 put은 데이터 저장 pop은 데이터 추출 clear는 큐를 비운다 size는 현재 큐에 저장된 자료의 개수를 리턴한다
JobQueue 클래스 추가 클래스명 JobQueue 구현되는 Queue 인터페이스 main 함수는 추가하지 않는다.
JobQueue 코드 수정 싱글레톤 JobQueue 객체를 사용하도록 함. 객체를 추가할 수 있을 때 추가한다. 객체가 있을 때를 기다려서 존재하면 꺼낸다.
Producer 클래스 추가 클래스명 JobQueue 구현되는 Runnable 인터페이스 main 함수는 추가하지 않는다.
Producer 클래스 코드 구현 스레드가 종료하지 않으면 계속하여 정수를 숫자를 증가 시키면서 추가함.
Producer 클래스 추가 클래스명 JobQueue 구현되는 Runnable 인터페이스 main 함수는 추가하지 않는다.
Consumer 클래스 코드 구현 스레드가 종료하지 않으면 계속하여 객체를 추출하여 출력함
Tester 클래스 추가
main 함수 구현 싱글레톤 JobQueue를 얻는다 소비자 생성 및 시작 생산자 생성 및 시작 0.5초후 생산자 중단 0.5초후 소비자 중단
예제 실행 소비자가 생성 순서와 관계없이 실행이 되고 종료 함을 알 수 있다.
실습 추가 지금까지 해본 예제를 다시 반복해서 해볼 것