제9장자바쓰레드
9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2
9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드 프로세스간의통신오버헤드 해결책 => 쓰레드 쓰레드 (thread) 실행될명령어들의연속 (a sequence of instructions to be executed) 쓰레드의장점 생성시적은오버헤드 주소공간을공유하기때문에자원공유가쉽고, 쓰레드간통신이쉬움 컨텍스트스위치시오버헤드가적음 자바 Thread 3
9.1 Thread 기초 (3/5) Thread 순차적으로동작하는문장들의단일집합 경량 (lightweight) 프로세스 다중처리기능 하나의프로그램에서하나이상의객체를생성하여실행할때 자바는스레드를지원하기위해 java.lang.thread 클래스제공 다수개의 CPU를가진컴퓨터에서다중스레드의실행 스레드 1 프로그램 스레드 2 스레드 3 프로그램 한개의 CPU 를가진컴퓨터에서다중스레드의실행 스레드 1 프로그램 스레드 2 스레드 3 프로그램 자바 Thread 4
9.1 Thread 기초 (4/5) 단일 Thread 전통적인프로세스 스케쥴링단위 = 프로세스 하나의 Class Instance 자바 Thread 5
9.1 Thread 기초 (5/5) 다중 Thread 하나의 Class Instance 에여러개의 thread 가존재 스케쥴링단위 = thread (Thread Class Instance) 자바 Thread 6
9.2 자바 Thread Class (1/3) 자바 Thread Class 종류 Thread 클래스 Runnable 인터페이스 자바 Class 상태도 자바 Thread 7
9.2 자바 Thread Class (2/3) JDK 는 Thread 를지원하는 java.lang.thread 클래스제공 Thread 를생성하기위해사용 4 개의생성자를제공 Thread() Thread(String s) Thread(Runnable r) Thread(Runnable r, String s) 자바 Thread 8
9.2 Java Thread 클래스의주요 method (3/3) 메소드이름 static void sleep(long msec) throws InterruptedException String getname() void setname(string s) void start() int getpriority() void setpriority(int p) boolean isalive() void join() throws InterruptedException void run() void suspend() 설명 msec에지정된밀리초 (milliseconds) 동안대기스레드의이름을반환스레드의이름을 s로설정스레드를시작시킨다. run() 메소드를호출스레드의우선순위를반환스레드의우선순위를 p값으로설정스레드가시작되었고아직끝나지않았으면 true를그렇지않으면 false를반환스레드가끝날때까지대기스레드가실행할부분을기술하는메소드하위클래스에서오버라이딩되어야한다스레드가일시정지된다. resume() 에의해다시시작될수 있다 자바 Thread 9
9.3 Thread 생명주기 - Java Thread instance 의생명주기 run() 실행 run() 종료 종료 new 생성 start() 실행가능상태 yield() 또는시간종료 interrupt() join() sleep() wait() 대기상태 대기 (join 할스레드가종료되기를기다림 ) join 스레드종료 대기 (sleep time 이끝나기를기다림 ) sleep time 종료 대기 (notify 신호를기다림 ) notify() notyfyall() 자바 Thread 10
9.4 Thread 생성과사용 (1/4) Thread를생성하는방법방법 1) Thread 클래스로부터직접상속받아 Thread를생성 Thread_Class extends Thread { } new Thread_Class; 수행할 thread object의생성 start(); : thread의시작 run() { } : thread의수행내용정의 방법 2) Runnable 인터페이스를사용하는방법 주로현재의클래스가이미다른클래스로부터상속받고있는경우 다중상속이되는경우는 Interfacce Class 를 Implement Thread_Class extends Other_class implements Runnable { } new Thread_Class; 수행할 thread object의생성 start(); : thread의시작 run() { } : thread의수행내용정의 자바 Thread 11
9.4 Thread 생성과사용 (2/4) 9.4.1 Thread 클래스이용 Thread 클래스로부터직접상속받아Thread를생성 Thread 클래스에서제공되는 run() 메소드를오버라이딩하여생성한 Thread를실행시킴 class MyThread extends Thread { // Thread 클래스로부터상속... MyThread me = new MyThread(); //Thread object 를생성 me.start(); // thread 를시작시킴... public void run() { // thread 가실행되는내용... // 상위클래스인 Thread 클래스의 run() 메소드를오버... // 라이딩하여스레드가수행하여야하는문장들을기술 }... } 자바 Thread 12
9.4 Thread 생성과사용 (3/4) 9.4.2 Runnable 인터페이스이용 현재의클래스가이미다른클래스로부터상속을받고있다면 Runnable 인터페이스를사용하여 thread를생성할수있다 Runnable 인터페이스는 JDK에의해제공되는라이브러리인터페이스이다 Runnable 인터페이스에는 run() 메소드만정의되어있다 public interface Runnable { } public void run(); 자바 Thread 13
9.4 Thread 생성과사용 (4/4) 예를들어, Applet 클래스로부터상속을받고있으므로인터페이스이용 class RunnableThead extends Applet implements Runnable {... RunnableThread ro = new RunnableThreas(); // 객체생성 Thread rt = new Thread(ro); // ro를매개변수로하여 thread 객체 rt를생성 rt.start(); // 스레드시작 public void run() {... // Runnable 인터페이스에정의된 run() 메소드를... // 오버라이딩하여스레드가수행할문장들을기술한다 }... } 자바 Thread 14
9.5 Thread 생성예제 (1/2) Thread 클래스로부터상속받는 Thread run() 메소드를재정의 예제 : MyTeam.java 동시에수행할 Thream 의생성및실행 Worker.java Thread 에필요한 run() 함수정의 자바 Thread 15
9.5 Thread 생성예제 (2/2) Runnable 인터페이스구현 예제 : TCarFactory.java TCarFactory Class 자체적으로수행할기능을정의하고있음. Operate() 함수부분 run() : Thread로실행부분을재작성 자바 Thread 16
9.6 Thread 종료 Thread 종료 쓰레드는 run() 메소드가끝나면, 종료된다 무한반복에서쓰레드를종료하는방법 반복문의조건을이용 while(stop == false) {... } break 이용 while(true) {... if(test) break; } 자바 Thread 17
쓰레드의일시중단 9.7 Thread 의동시성 suspend() 쓰레드를잠시중단시킴 resume() 중단된쓰레드를다시시작시킴 예제 : SuspendTest.java 7 ma = new Thread(this, " 마당쇠 "); 8 ma.start(); 9 try { 10 Thread.sleep(5000); 11 System.out.println(" 쓰레드를중지시킵니다."); 12 ma.suspend(); 13 Thread.sleep(3000); 14 System.out.println(" 쓰레드를다시시작시킵니다."); 15 ma.resume(); 자바 Thread 18
9.8 Thread Scheduling Thread 스케쥴링 우선순위선점 (preemptive) 방식 우선순위값 : 0 ~ 10 예제 : PriorityTest.java 13 Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 14 ma.start(); 18 System.out.println(" 마당쇠우선순위를 +2 증가 "); 19 ma.setpriority(ma.getpriority() + 2); 20 Thread.sleep(3000); 21 System.out.println(" 돌쇠우선순위를 +4 증가 "); 22 dol.setpriority(dol.getpriority() + 4); 23 Thread.sleep(5000); 자바 Thread 19
9.9 Thread 동기화 동기화 synchronized 키워드사용 예제 : LockTest.java 23 public synchronized void docriticaljob() { 24 String name = Thread.currentThread().getName(); 25 System.out.print("[" + name + " t"); 26 try { 27 int time = (int)(math.random() * 2000); 28 Thread.sleep(time); 29 } catch(exception e) { } 30 System.out.println(" t" + name + "]"); 31 } 자바 Thread 20
9,10 Thread 응용예 생산자와소비자 Monitor Producer add(char c) eat( ) Consumer ADGHCE 자바 Thread 21