10장 다중 스레드

28
1 10 장 장장 장장장 10.1 장장장 장장 10.2 Thread 장장장 10.3 장장장 장장 10.4 장장장 장장 장장 10.5 장장장 (Synchronization) 10.6 장장장 장장장 장장

Upload: sonya-foley

Post on 04-Jan-2016

63 views

Category:

Documents


5 download

DESCRIPTION

10장 다중 스레드. 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성 10.4 스레드 우선 순위 10.5 동기화 ( Synchronization) 10.6 스레드 사이의 통신. 10.1 스레드 개요. 스레드 순차적으로 동작하는 문장들의 단일 집합 경량( lightweight) 프로세스 다중 스레드 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성하여 실행할 때 자바는 스레드를 지원하기 위해 java.lang.Thread 클래스 제공. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 10장 다중 스레드

1

10 장 다중 스레드

10.1 스레드 개요10.2 Thread 클래스10.3 스레드 생성10.4 스레드 우선 순위10.5 동기화 (Synchronization)10.6 스레드 사이의 통신

Page 2: 10장 다중 스레드

2

10.1 스레드 개요

스레드 순차적으로 동작하는 문장들의 단일 집합 경량 (lightweight) 프로세스 다중 스레드

하나의 프로세스 ( 프로그램 ) 에 하나 이상의 스레드를 생성하여 실행할 때

자바는 스레드를 지원하기 위해 java.lang.Thread 클래스 제공

Page 3: 10장 다중 스레드

3

스레드 개요 - 다중 스레드

두개의스레드

하나의프로그램

Page 4: 10장 다중 스레드

4

Page 5: 10장 다중 스레드

5

스레드 개요 - 스레드 생명주기

스레드는 탄생하고 소멸될 때까지 생명주기 (life cycle) 를 가진다

생성

완료

실행상태

대기실행가능

상태start()

sleep(), wait(), suspend(),입출력 등

notify(), notifyAll(), resume(), 입출력 완료 등

스레드의 생명주기

Page 6: 10장 다중 스레드

6

10.2 Thread 클래스 JDK 는 스레드를 지원하는 java.lang.Thread 클래스

제공 스레드를 생성하기 위해 사용 4 개의 생성자를 제공

Thread()Thread(String s)Thread(Runnable r)Thread(Runnable r, String s)

Page 7: 10장 다중 스레드

7

Thread 클래스의 메소드static void sleep(long msec) msec 에 지정된 밀리초 (milliseconds)

동안 대기 throws InterruptedExceptionstatic void sleep(long msec, int nsec) msec 에 지 정 된 밀 리 초 +nsec 에

지정된 throws InterruptedException 나노초 (nanoseconds) 동안 대기String getName() 스레드의 이름을 반환void setName(String s) 스레드의 이름을 s 로 설정void start() 스레드를 시작시킨다 . run() 메소드를 호출int getPriority() 스레드의 우선 순위를 반환void setPriority(int p) 스레드의 우선 순위를 p 값으로 설정boolean isAlive() 스레드가 시작되었고 아직 끝나지 않았으면

true 를 그렇지 않으면 false 를 반환void join() 스레드가 끝날 때까지 대기 throws InterruptedExceptionvoid run() 스레드가 실행할 부분을 기술하는 메소드 .

하위 클래스에서 오버라이딩 되어야 한다void suspend() 스레드가 일시 정지된다 . resume() 에 의해 다시

시작될 수 있다 .void resume() 일시 정지된 스레드를 다시 시작시킨다 .

Page 8: 10장 다중 스레드

8

10.3 스레드의 생성 스레드를 생성하는 2 가지 방법

Thread 클래스로부터 직접 상속받아 스레드를 생성 Runnable 인터페이스를 사용하는 방법 ( 현재의 클래스가

이미 다른 클래스로부터 상속 받고 있는 경우 )

Page 9: 10장 다중 스레드

9

스레드의 생성 - Thread 클래스 이용 Thread 클래스로부터 직접 상속 받아 스레드를 생성 Thread 클래스에서 제공되는 run() 메소드를

오버라이딩하여 스레드의 동작을 기술

class ThreadA extends Thread { // Thread 클래스로부터 상속

......... public void run() { .... // 상위 클래스인 Thread 클래스의 run() 메소드를

오버 .... // 라 이딩하여 스레드가 수행하여야 하는 문장들을 기술

} ....…

}

ThreadA ta = new ThreadA();ta.start();// 스레드 객체를 생성하여 스레드를 // 시작시킨다

Page 10: 10장 다중 스레드

10

스레드의 생성 - Runnable 인터페이스 이용

현재의 클래스가 이미 다른 클래스로부터 상속을 받고 있다면 Runnable 인터페이스를 사용하여 스레드를 생성할 수 있다

Runnable 인터페이스는 JDK 에 의해 제공되는 라이브러리 인터페이스이다

Runnable 인터페이스에는 run() 메소드만 정의되어 있다

public interface Runnable {

public void run();

}

Page 11: 10장 다중 스레드

11

스레드의 생성 - Runnable 인터페이스 이용 이미 Applet 클래스로부터 상속을 받고 있으므로 인터페이스 이용

class RunnableB extends Applet implements Runnable { ......… public void run() { ........ // Runnable 인터페이스에 정의된 run() 메소드를 ........ // 오버라이딩하여 스레드가 수행할 문장들을 기술한다 } .....…}

Page 12: 10장 다중 스레드

12

스레드의 생성 - Runnable 인터페이스 이용 Runnable 인터페이스를 이용하여 스레드를 생성하는 방법

RunnableB rb = new RunnableB(); // 객체 rb 생성Thread tb = new Thread(rb); // rb 를 매개변수로 하여 스레드 객체 tb 를 생성tb.start(); // 스레드 시작

또는

RunnableB rb = new RunnableB(); new Thread(rb).start(); // 스레드 객체를 생성하여 바로 시작

Page 13: 10장 다중 스레드

13

스레드의 생성 예제

ThreadfromThread.java

ThreadfromRunnable.java

ThreadDouble.java

Page 14: 10장 다중 스레드

14

10.4 스레드 우선 순위 스레드에 우선 순위를 부여하여 우선 순위가 높은

스레드에게 실행의 우선권을 부여할 수 있다 setPriority() 메소드를 이용하여 우선 순위 부여 우선 순위를 지정하기 위한 상수 제공

static final int MAX_PRIORITY 우선순위 10

static final int MIN_PRIORITY 우선순위 1

static final int NORM_PRIORITY 우선순위 5

Page 15: 10장 다중 스레드

15

10.4 스레드 우선 순위

예제

ThreadPriority.java

Page 16: 10장 다중 스레드

16

10.5 동기화 (Synchronization)

대부분의 응용 프로그램에서 다수개의 스레드가 공유할 수 있는 부분이 요구된다

공유부분은 상호 배타적으로 사용되어야 한다 임계영역 (critical section)

상호배타적으로 사용되는 공유부분 자바는 한 순간에 하나의 스레드만 실행할 수 있는

synchronized method 제공 한 스레드가 synchronized method 를 수행 중이면 다른

스레드는 대기한다

Page 17: 10장 다중 스레드

17

동기화 (Synchronization) - synchronized method 수행

시간

t0 lock 을 얻는다

t1 lock 을 요청하지만 이미

t2 사용중이므로 기다린다

t3

t4 lock 을 양보한다

t5 lock 을 얻는다

t6

t7

t8

t9 lock 을 양보한다

synchronizedmethod

synchronizedmethod

스레드 A 스레드 B

………………

………………..임계영역 문장들………………..………………..

………………..임계영역 문장들………………..………………..

Page 18: 10장 다중 스레드

18

동기화

TVContribution.java

Page 19: 10장 다중 스레드

19

class Account { private int total = 0; synchronized void deposit(int amount) { // 임계영역을 지정하는 synchronized 메소드 total += amount; } int gettotal() { return total; }}

Page 20: 10장 다중 스레드

20

class Customer extends Thread { Account account1; Customer(Account account) { // Customer 객체를 생성하는 생성자의 매개변수로 Account 객체를 // 받아들여 현재의 account1 객체에 연결 ( 같은 주소를 가진다 ) this.account1 = account; } public void run() { try { for(int i = 0; i < 200 ; i++) { System.out.println(" 성금자 " + getName() + " : " + i +" 번째 "); account1.deposit(1000); sleep(2); if (account1.gettotal() >= 500000) break; } } catch(Exception e) { System.out.println(e); } }}

Page 21: 10장 다중 스레드

21

class TVContribution { public static void main(String args[]) { Account account = new Account(); // Account 객체 account 생성

Customer customers[] = new Customer[5]; // 5 명의 성금자 객체 생성 for(int i = 0; i < 5 ; i++) { customers[i] = new Customer(account); // 5 개의 스레드 객체를 생성한다 // 5 개의 스레드를 account 객체를 매개 변수로 하여 생성 customers[i].start(); // 스레드를 시작 } for(int i = 0; i < 5; i++) { try { customers[i].join(); // 모든 스레드가 끝날 때까지 대기 } catch(InterruptedException e) { e.printStackTrace(); } } System.out.println(" 성금 총액은 : " + account.gettotal()); // 성금 총액 인쇄 }}

Page 22: 10장 다중 스레드

22

10.5 스레드 사이의 통신 java.lang.Object 클래스에서는 스레드 사이의 통신을

위해 3 개의 메소드를 제공 wait() 메소드 : 스레드 수행중 이 메소드를 만나면

가지고 있는 lock 을 양보하고 대기상태로 들어간다

void wait() throws InterruptedExceptionvoid wait(long msec) throws InterruptedExceptionvoid wait(long msec, int nsec) throws InterruptedExceptionvoid

msec 와 nsec 는 대기 시간을 의미

Page 23: 10장 다중 스레드

23

스레드 사이의 통신

notify() : 대기 상태의 스레드중에서 하나의 스레드를 깨운다

notifyAll() : 대기 상태의 모든 스레드를 깨운다

void notify()

void notifyAll()

ProducerConsumer.java

Page 24: 10장 다중 스레드

24

class Producer extends Thread { private Buffer blank;

public Producer(Buffer blank) { this.blank = blank ; } public void run() { for (int i=0; i<10;i++) { blank.put(i); // 생산자 스레드는 계속해서 put() 메소드 호출 System.out.println(" 생산자 : 생산 " + i);

try { sleep((int)(Math.random() * 100 )); } catch (InterruptedException e) { } } }}

Page 25: 10장 다중 스레드

25

class Consumer extends Thread { private Buffer blank; public Consumer(Buffer c) { blank = c; } public void run() { int value = 0; for (int i = 0 ; i < 10 ; i++ ) { value = blank.get(); // 소비자 스레드는 계속 get() 메소드를 호출 System.out.println(" 소비자 : 소비 " + value);

} }}

Page 26: 10장 다중 스레드

26

class Buffer { private int contents; private boolean available = false; // flag 역할을 하는 available 변수의 초기값을 false 로 설정 // 처음에는 생산자가 먼저 데이터를 가져다 놓아야 한다

public synchronized int get() { // 임계영역을 지정하는 메소드 . 버퍼로부터 데이터를 get while (available == false ) { try { wait(); } catch (InterruptedException e) {} } System.out.println(" 소비자 ########## : 소비 " + contents); notify();

available = false;

// 데이터를 반환하기전에 put() 에 들어가기위해 // 기다리는 메소드를 깨운다 return contents; }

Page 27: 10장 다중 스레드

27

public synchronized void put(int value) { // 임계영역을 지정하는 메소드 . 버퍼에 데이터를 put while (available == true ) { try { wait(); } catch (InterruptedException e) {} } contents = value; System.out.println(" 생산자 ########## : 생산 " + contents); notify();

available = true; // 값을 저장하고 get() 메소드에 들어가기 위해 // 대기하고 있는 스레드중에 하나를 깨운다 }}

Page 28: 10장 다중 스레드

28

public class ProducerConsumer { public static void main(String args[]) { Buffer c = new Buffer(); Producer p1 = new Producer(c); Consumer c1 = new Consumer(c); // 생산자와 소비자 스레드 객체를 생성 // 버퍼 객체 c 를 매개변수로 생성한다 p1.start() ; c1.start() ; }}