10장 다중 스레드

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

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 of 10장 다중 스레드

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() ; }}