Presentation is loading. Please wait.

Presentation is loading. Please wait.

예외 처리 및 스레드 클래스 활용 학습목표 오류 발생 시 무조건 정지하지 않고 경우에 따라서 예외 처리하여 정상 작동을 하는 경우의 Exception 클래스에 대해서 학습한다. 멀티미디어 파일에서 동시에 다운로드 받는 효과를 갖을 수 있는 스레드(Thread) 클래스에.

Similar presentations


Presentation on theme: "예외 처리 및 스레드 클래스 활용 학습목표 오류 발생 시 무조건 정지하지 않고 경우에 따라서 예외 처리하여 정상 작동을 하는 경우의 Exception 클래스에 대해서 학습한다. 멀티미디어 파일에서 동시에 다운로드 받는 효과를 갖을 수 있는 스레드(Thread) 클래스에."— Presentation transcript:

1 예외 처리 및 스레드 클래스 활용 학습목표 오류 발생 시 무조건 정지하지 않고 경우에 따라서 예외 처리하여 정상 작동을 하는 경우의 Exception 클래스에 대해서 학습한다. 멀티미디어 파일에서 동시에 다운로드 받는 효과를 갖을 수 있는 스레드(Thread) 클래스에 대해서 학습한다.

2 예외 상황과 예외 처리 스레드 클래스 java.io 패키지 Section 01 개요(1/1)
예외 상황이 발생하는 경우에 프로그램이 비정상적으로 마치거나 잘못된 실행이 되는 경우가 많다. 예외 처리(Exception Handling)란 자바 프로그램을 신뢰성 있는 프로그램으로 만들기 위해서 스스로 오류를 복구하는 것이 아니라 오류 발생 가능성이 있는 부분에 대해서 미리 프로그램으로 처리를 해주는 데 목적이 있다. 스레드 클래스 스레드(thread)란 가장 작은 실행 단위이다. 스레드는 일반적인 순차적인 프로그램들처럼 시작, 끝, 실행 순서 등을 갖지만 그 자체가 프로그램은 아니며, 독립적으로 실행될 수 없고 프로그램 안에서만 실행되는 작업의 단위이다. java.io 패키지 자바에서의 입출력은 키보드, 마우스, 파일에서의 입력, 화면, 프린터, 파일에서의 출력 등을 의미한다. 자바에서의 입출력은 스트림(stream) 객체를 통하여 이루어진다. 스트림이란 입력원(source)에서 출력지(sink)로의 순서가 있는 데이터의 흐름을 말한다.

3 Section 02 예외 처리와 Exception 클래스 (1/8)
예외 처리의 필요성 및 개념 예외란 프로그램 실행 중에 비정상적으로 발생하는 예기치 않은 사건을 의미한다. 즉, 예외 상황인 경우는 숫자를 0으로 나누는 불능인 경우,  배열의 첨자가 벙위를 벗어나는 경우, 파일 저장 및 쓰기를 하는 데 해당 파일이 없는 경우 등이 해당된다. 예외 상황이 발생하는 경우에 프로그램이 비정상적으로 마치거나 잘못된 실행이 되는 경우가 많다. 예외 처리(Exception Handling)란 자바 프로그램을 신뢰성 있는 프로그램으로 만들기 위해서 스스로 오류를 복구하는 것이 아니라 오류 발생 가능성이 있는 부분에 대해서 미리 프로그램으로 처리를 해주는 데 목적이 있다. 예외 상황의 종류 및 예외 클래스의 계층 구조 자바에서는 예외를 객체로 다루고 있으며, 각각의 예외들을 클래스로 정의하고 있다. 예외 클래스는 java.lang 패키지 내에 속하기 때문에 기본 패키지이므로 import문을 생략해도 된다. 최상위 클래스는 Throwable 클래스, 그 하위 클래스는 Error 클래스와 Exception 클래스가 있다.

4 Section 02 예외 처리와 Exception 클래스 (2/8)
예외 상황의 종류 및 예외 클래스의 계층 구조 Error 클래스의 자손이 발생하면 치명적인 오류이므로 프로그램이 종료되는 것이 당연하다. Exception 클래스의 자손이 발생하면 덜 치명적인 오류이므로 프로그램이 종료되는 것보다는 오류 메시지 등을 내보내고 오류 발생 가능성이 있는 부분에 대해서 미리 프로그램으로 처리를 해주는 것이다. 즉, 에외처리의 대상은 Exception 클래스 및 자손 클래스들이다. 예외 클래스는 java.lang 패키지 내에 속하지만,  IOException 클래스 및 그 하위 클래스는 java.io 패키지에 속한다. RuntimeException CloneNotSupportedException IllegalAccessException InstantiationException InterruptedException NotSuchMethodException ClassNotFoundException IOException ClassCaseException ArithmeticException NegativeArraySizeException NullPointerException ArrayStoreException IndexOutOfBoundException SecurityException EOFException InterruptedIOException FileNotFoundException Exception Throwable Error Exception Object LinkageError ThreadDeath VirtualMachineError Error

5 Section 02 예외 처리와 Exception 클래스 (3/8)
클래스명         예외상황 RuntimeException 실행 시간 예외가 발생할 경우 CloneNotSupportedException 객체의 복제가 지원되지 않은 상황에서의 복제 시도의 경우 IllegalAccessException 클래스에 대한 부정 접근의 경우 InstantiationException 추상 클래스나 인터페이스로부터 객체 생성하려 할 경우 InterruptedException 쓰레드나 인터럽트 되었을 경우 NotSuchMethodException 메소드가 존재하지 않을 경우 ClassNotFoundException 클래스가 존재하지 않을 경우 IOException 입출력시에 파일 등이 존재하지 않을 경우 RuntimeException 클래스의 하위 클래스의 종류 및 예외상황 클래스명 예외상황 ArithmeticException 0으로 나눌 때 산술적인 예외의 경우 NegativeArraySizeException 배열의 크기를 음수로 지정할 경우 NullPointerException null 객체의 메소드나 멤버 변수에 접근할 경우 ArrayStoreException 배열의 원소에 잘못된 형의 객체를 배정하였을 경우 IndexOutOfBoundException 배열, 스트링, 벡터 등과 같이 인덱스를 사용하는 객체에서 인덱스의 범위를 벗어나는 경우 SecurityException 보안으로 인하여 메소드를 실행할 수 없는 경우

6 Section 02 예외 처리와 Exception 클래스 (4/8)
예외 처리는 예외 상황을 찾아내서 이를 처리한 다음에 계속 프로그램을 진행하는 것이다. 오류가 발생했을 때 오류 처리 루틴은 자동으로 호출하지만 이러한 루틴은 프로그래머가 직접 작성해야 한다. 이러한 예외 처리 방법에는 크게 두가지로 나눌수 있는 데, 첫번 째는 try-catch-finally 문을 사용하는 방법, 둘째는 throws 문을 이용하는 방법이다.  또한 예외를 시스템에서 자동적으로 발생하는 것이 아니라 프로그래머가 직접 만들고, 이를 원하는 시점에 발생시킬 수 있는 방법을 사용자 정의 예외(User Defined Execption)라고 한다. 이 방식은 throw 문을 이용한다.

7 Section 02 예외 처리와 Exception 클래스 (5/8)
try-catch-finally 문 try 문은 단독으로 사용할 수 없고, catch 문이나, finally 문과 함께 사용한다. try 문은 예외 상황이 발생할 수 있는 범위를 지정한다. try 문장이  포함된 블록에서 예외 상황이 발생되면 catch 문으로 제어가 이동한다. catch문은 try 문에서부터 제어를 넘겨받는 블록이며 예외가 발생하지 않으면 catch 블록은 실행되지 않는다. 예외가 발생되고, 그 종류가 여기서 명시된 오류이면 catch 블록이 실행된다. try, catch 명령문을 사용할 경우에 finally 문은 생략할 수도 있다. 만일 사용되면 예외 상황과 관계 없이 제어가 finally 문으로 이동된다. finally 블록에서는 간단하게 파일을 닫거나 메소드 실행 시에 할당되었던 자원들을 해제하는 일들을 실행할 수도 있다. finally 문은 try나  catch  블록에서 return 문을 만나더라도 반드시 실행된다.

8 Section 02 예외 처리와 Exception 클래스 (6/8)
try-catch-finally 문의 사용 형식 try {            예외 발생 가능 명령문들       } catch (예외 클래스1 객체명 1) {              예외 1에 대한 예외 처리 명령문        catch (예외 클래스n 객체명n) {       예외 n에 대한 예외 처리 명령문 finally {              모든 예외 상황에 반드시 실행해야하는 명령문

9 [실습하기 10-1] 숫자를 0으로 나누었을 때 예외 처리 (try-catch-finally 문 이용) (1/3)

10 [실습하기 10-1] 숫자를 0으로 나누었을 때 예외 처리 (try-catch-finally 문 이용) (2/3)
01  class Jv_10_1 { 02     public static void main(String[] args) { 03         System.out.println("===== 예외처리 프로그램 (try-catch-finally) ====="); 04  05      try {    06               int ken = 0; 07               int boo = 50 / ken; 08          } 09          catch (ArithmeticException e) { 10               System.out.println(e);  11          } 12          finally { 13            System.out.println("==== finally step ====");    14          } 15    } 16  } Jv_10_1.java

11 [실습하기 10-1] 숫자를 0으로 나누었을 때 예외 처리 (try-catch-finally 문 이용) (3/3)
05~08행: try 문은 예외 상황이 발생할 수 있는 범위를 지정한다. 여기서는 50을 0으로 나누면 수학에서는 불능이며 예외 상황이 발생한다. try 문장이  포함된 블록에서 예외 상황이 발생되면 catch 문으로 제어가 이동한다. 즉, try 문은 단독으로 사용할 수 없고, catch 문이나, finally 문과 함께 사용한다. 09~11행:  try 문에서부터 제어를 넘겨받는 블록이며 예외가 발생하지 않으면  catch 블록은 실행되지 않는다. 예외가 발생되고, 그 종류가 여기서 명시된 산술 오류(ArithmeticException)이면 catch 블록이 실행된다. 여기서 사용되는 e는 event를 의미하며, 어떤 종류의 산술 오류가 발생했는 지를 알 수 있는 정보를 포함한다. System.out.println() 메소드를 이용해 e에 포함된 산술과 관련된 오류 정보를 화면에 출력한다. 12~14행: try, catch 명령문을 사용할 경우에 finally 문은 생략할 수도 있다. 만일 사용되면 예외 상황과 관계 없이 제어가 finally 문으로 이동된다. 그러므로 "==== finally step ====" 문자 메시지가 화면에 출력된다. finally 블록에서는 간단하게 파일을 닫거나 메소드 실행시에 할당되었던 자원들을 해제하는 일들을 실행할 수도 있다. 프로그램 구조 설명

12 Section 03 예외 처리와 Exception 클래스 (7/8)
throws 문의 사용형식 메소드명() throws  예외명1, 예외명2, ... , 예외명n {          }

13 [실습하기 10-2] 숫자를 0으로 나누었을 때 예외 처리 (throws 문 이용) (1/3)

14 [실습하기 10-2] 숫자를 0으로 나누었을 때 예외 처리 (throws 문 이용) (2/3)
01  class Jv_10_2 { 02     static void calc() throws ArithmeticException {   03            int ken = 0; 04            int boo = 50 / ken; 05     } 06  07     public static void main(String[] args) { 08      System.out.println("===== 예외처리 프로그램 (throws) ====="); 09  10      try {    11                calc(); 12          } 13          catch (ArithmeticException e) { 14               System.out.println(e);  15          } 16         finally { 17            System.out.println("==== finally step ====");    18          } 19     } 20  } Jv_10_2.java

15 [실습하기 10-2] 숫자를 0으로 나누었을 때 예외 처리 (throws 문 이용) (3/3)
02~05, 11 행: main() 메소드에서 calc() 메소드를 호출한다. calc() 메소드 내에서 예외 상황이 발생하면, throws ArithmeticException 문을 통하여  catch 블록으로 제어가 이동하게 된다. 13~15 행:  throws 문에서부터 제어를 넘겨받는 블록이며 예외가 발생하지 않으면 catch 블록은 실행되지 않는다. 예외가 발생되고, 그 종류가 여기서 명시된 산술 오류(ArithmeticException)이면 catch 블록이 실행된다. 여기서 사용되는 e는 event를 의미하며, 어떤 종류의 산술 오류가 발생했는 지를 알 수 있는 정보를 포함한다. System.out.println() 메소드를 이용해 e에 포함된 산술과 관련된 오류 정보를 화면에 출력한다. 프로그램 구조 설명

16 Section 03 예외 처리와 Exception 클래스 (8/8)
throw 문의 사용형식 throw new 예외명();

17 [실습하기 10-3] NoDigitException이라는 예외를 발생시키고, throw 문을 이용하여 예외 처리 (1/3)

18 [실습하기 10-3] NoDigitException이라는 예외를 발생시키고, throw 문을 이용하여 예외 처리 (2/3)
01  class NoDigitException extends Exception { } 02  03  public class Jv_10_3 { 04     public static void main(String[] args) throws java.io. IOException { 05      System.out.println("===== 사용자 정의 예외 (throw) ====="); 06          char c; 07          int sum = 0; 08  09      try {    10                for (int i=0; i < 5; i++) { 11                    c = (char) System.in.read(); 12                    if (!Character.isDigit(c)) 13                        throw new NoDigitException(); 14                    else 15                        sum += c - '0'; 16                } 17               System.out.println("입력된 숫자의 합 ->" + sum);  18          } 19          catch (NoDigitException e) { 20               System.out.println("입력된 값 -> 숫자 아님");  21          } 22     } 23  } Jv_10_3.java

19 [실습하기 10-3] NoDigitException이라는 예외를 발생시키고, throw 문을 이용하여 예외 처리 (3/3)
01행: Exception 클래스를 상속 받은 후 NoDigitException 클래스를 정의하고, 나머지 부분은 일반적인 클래스를 선언과 동일하다. 10~22행: 숫자 0부터 9까지의 한 자리 숫자 5개를 입력 받으면 합을 구하는 부분이다. 만일 그 숫자 중간에 문자를 입력 받게 되면 NoDigitException이라는 예외를 발생시키고, 예외 처리를 한다 프로그램 구조 설명

20 Section 04 스레드(Thread) 클래스 (1/6)
스레드의 개념 스레드(thread)란 가장 작은 실행 단위이다. 즉, 프로세스(process) 내에서 순차적으로 동작하는 단일 집합으로서 단위 업무를 실행하는 일련의 제어의 흐름이다. 스레드는 일반적인 순차적인 프로그램들처럼 시작, 끝, 실행 순서 등을 갖지만 그 자체가 프로그램은 아니며, 독립적으로 실행될 수 없고 프로그램 안에서만 실행되는 작업의 단위이다. 하나의 프로세스 내에서 여러 개의 스레드가 모여서 작업을 하는 것을 다중 스레드(multi-thread)라고 한다. 다중 스레드의 예는 웹브라우저에서 어떤 웹서버에 접속하여 멀티미디어 웹 문서를 다운로드(download) 받게 되면 문자, 이미지, 음악 파일 들이 동시에 받게 되는 것처럼 느껴진다. 실제로는 중앙처리장치(CPU)가 어느 시점에서는 한 쓰레드만 실행되며, 스레드를 아주 빠르게 번갈아 가면서 실행하는 것이다. 프로세스란 운영체제에서 실행되는 하나의 프로그램을 말한다. 다중 프로세스(multi-process)란 하나의 운영체제 내에서 여러개의 프로세스 모여서 작업을 하는 것을 의미한다. 그 예는 미디어 플레이어를 실행시키면서 동시에 파워포인터를 실행시키면, 운영체제에서 두개의 프로세스를 실행시키고 있는 것이다.

21 Section 04 스레드(Thread) 클래스 (2/6)
스레드와 프로세스, 운영체제의 관계 운영체제 프로세스 스레드

22 Section 04 스레드(Thread) 클래스 (3/6)
스레드의 생명주기 자바에서는 스레드를 객체로 다루고 있으며, 클래스로 정의하고 있다.  스레드 클래스는 java.lang 패키지 내에 속하며  스레드의 생명 주기(life cycle)는 다음과 같다. 스레드 객체가 생성되면 start() 메소드에 의해서 실행 가능 상태(runnable)가 된다. 자바 가상 머신(JVM)은 하나의 프로세스 내의 여러 실행 가능한 스레드들 중에서 스케쥴링 기법에 의하여 하나를 선택하여 실행 상태(run)로 만든다. 실행이 종료된 스레드는 종료 상태가 되며 메모리의 할당도 해제된다. 실행 중인 스레드는 sleep(), wait(), suspend() 메소드를 만나게 되면 실행을 중단하고 대기 상태로 된다. 대기 상태가 끝나거나 notify(), notifyAll(), resume() 메소드를 만나면 다시 실행상태로 되돌아간다. 실행 상태 (run) 실행 가능 상태 (runnable) 종료 대기 생성 sleep(), wait(),suspend() notify(), notifyAll(), resume() strat()

23 Section 04 스레드(Thread) 클래스 (4/6)
스레드의 생성 방법 자바에서 쓰레드를 생성하는 방법에는 2가지가 있다. Runnable 인터페이스에 있는 run() 메소드를 구현하고 있는 클래스의 객체를 인수로 Thread 클래스의 생성자에 전달하여 스레드 객체를 생성하는 방법이다. class 클래스명 implements Runnable {    public void run() {        }       } 클래스명  객체변수명1 = new 클래스명(); Thread 객체변수명2 = Thread (객체변수명1);  객체변수명2.start();

24 Section 04 스레드(Thread) 클래스 (5/6)
스레드의 생성 방법 자바에서 쓰레드를 생성하는 방법에는 2가지가 있다. Thread 클래스를 확장한 클래스에서 Thread 클래스에 정의된 run() 메소드를 상속 받아 오버라이드하고 확장한 클래스의 쓰레드 객체를 생성하는 방법이다. class 클래스명 extends Thread {    public void run() {        }       } 클래스명  객체변수명1 = new 클래스명(); 객체변수명1.start();

25 [실습하기 10-4] Runnable 인터페이스의 run() 메소드를 구현 (1/4)

26 [실습하기 10-4] Runnable 인터페이스의 run() 메소드를 구현 (2/4)
01  class Jv_10_4 implements Runnable { 02     Thread t; 03  04     public static void main(String[] args) { 05          System.out.println("***** 다중 쓰레드(Runnable 이용) *****");     06          Jv_10_4 r1 = new Jv_10_4("Thread1"); 07          Jv_10_4 r2 = new Jv_10_4("Thread2"); 08          Jv_10_4 r3 = new Jv_10_4("Thread3"); 09     } 10     public Jv_10_4(String str) {   11          t = new Thread(this, str); 12            t.start(); 13    } 14  15    public void run() {  16          System.out.println("run() start! => " + t.getName()); 17       for (int i=0; i<3; i++) { 18              System.out.println("run() STEP" + i + " : " + t.getName()); 19              try { 20                     Thread.sleep(100); Jv_10_4.java

27 [실습하기 10-4] Runnable 인터페이스의 run() 메소드를 구현 (3/4)
21              } catch (InterruptedException e) { 22                   e.printStackTrace(); 23              } 24          } 25          System.out.println("run() end! => " + t.getName()); 26    } 27  } Jv_10_4.java

28 [실습하기 10-4] Runnable 인터페이스의 run() 메소드를 구현 (4/4)
01행: 자바에서 쓰레드를 생성하는 방법에는 2가지가 있다. 여기서는 Runnable 인터페이스에 있는 run() 메소드를 구현하고 있는 클래스의 객체를 인수로 Thread 클래스의 생성자에 전달하여 쓰레드 객체를 생성하는 방법이다. 쓰레드를 사용하기 위하여 Runnable를 선언한다. 02행: 쓰레드를 만들기 위하여 thread 클래스형 변수로 t를 선언한다. 06~08행:  Runnable 인터페이스 객체 r1, r2, r3를 생성한다. Jv_10_4가 쓰레드 클래스 명이 된다. 10~13행: 쓰레드 클래스에 대한 생성자를 선언한다. t = new Thread(this, str);에서 Thread 형 변수에 대한 메모리를 할당한다. 여기서 this 변수를 이용해 쓰레드를 맏들려는 클래스를 알려주고, str 변수를 이용해 해당 쓰레드 명을 알려 주어야 한다. t.start();에서 start() 메소드에 의하여 run() 메소드가 실행되어 쓰레드의 실행이 시작된다. 프로그램 구조 설명

29 [실습하기 10-5] Thread 클래스를 확장한 클래스에서 run() 메소드를 오버라이드 (1/4)

30 [실습하기 10-5] Thread 클래스를 확장한 클래스에서 run() 메소드를 오버라이드 (2/4)
01  class Jv_10_5 extends Thread { 02     Thread t; 03  04     public static void main(String[] args) { 05          System.out.println("***** 다중 쓰레드(Thread 이용) *****");     06      Jv_10_5 r1 = new Jv_10_5("Thread1"); 07          Jv_10_5 r2 = new Jv_10_5("Thread2"); 08          Jv_10_5 r3 = new Jv_10_5("Thread3"); 09     } 10  11     public Jv_10_5(String str) {   12          t = new Thread(this, str); 13            t.start(); 14    } 15  16    public void run() {  17          System.out.println("run() start! => " + t.getName());     18       for (int i=0; i<3; i++) { 19              System.out.println("run() STEP" + i + " : " + t.getName());     20              try { 21                     Thread.sleep(100); Jv_10_5.java

31 [실습하기 10-5] Thread 클래스를 확장한 클래스에서 run() 메소드를 오버라이드 (3/4)
22              } catch (InterruptedException e) { 23                   e.printStackTrace(); 24              } 25          } 26          System.out.println("run() end! => " + t.getName());     27    } 28  } Jv_10_5.java

32 [실습하기 10-5] Thread 클래스를 확장한 클래스에서 run() 메소드를 오버라이드 (4/4)
01행: 자바에서 스레드를 생성하는 방법에는 2가지가 있다. 여기서는 Thread 클래스를 확장한 클래스에서 Thread 클래스에 정의된 run() 메소드를 상속 받아 오버라이드하고 확장한 클래스의 스레드 객체를 생성하는 방법이다. 프로그램 구조 설명

33 Section 04 스레드(Thread) 클래스 (6/6)
스레드에서의 동기화 쓰레드에서 동기화(synchronization)란 다중 쓰레드 환경에서 한번에 하나의 쓰레드 만이 공유 데이터를 접근할 수 있도록 제어하는 것을 말한다. 여러 쓰레드가 동시에 실행되는 다중 쓰레드에서 데이터를  공유하기 위해서는 어떤 쓰레드가 다른 쓰레드의 상태와 행동 등을 고려해야 한다. 그렇지 않으면 데이터의 균형에 있어서 심각한 문제를 야기 할 수 있다. 예를 들면, 다중 쓰레드에서 어떤 공유된 파일이 있는 데, 어떤 쓰레드는 그 파일에 쓰고, 동시에 다른 쓰레드는 읽고 있다고 가정하면, 읽고 있는 쓰레드는 원하는 데이터를 참조하지 못할 심각한 경우가 발생할 수 있다. 어떤 객체가 접근하는 동안에는 잠금(lock)을 하여서 다른 객체가 접근하지 못하도록하고 일이 완료되면 잠금을 해제하여 다른 객체가 접근가능하도록 하는 방식을 사용한다. 이러한 기법을 모니터 기법이라고 한다. 데이터를 쓰거나 읽으려는 공유된 메소드에 synchronized 키워드를 선언하게 되면 그 메소드에는 어떤 객체가 접근하는 동안에는 잠금(lock)을 하여서 다른 객체가 접근하지 못하도록 하고 일이 완료되면 잠금을 해제하여 다른 객체가 접근가능 하도록 하는 방식을 사용한다. 즉, 그 메소드에는 임계 영역(critical region)이 설정된 것이다. 임계 영역이란 데이터를 조작하는 코드의 집합을 의미한다. 임계 영역의 대표적인 예는 비행기의 활주로 공간이다. 비행기가 이착륙하는 동안에 그 공간에서 다른 비행기가 이착륙할 수 없다.

34 [실습하기 10-6] 스레드의 동기화(Synchronization) 방식 사용하지 않기 (1/5)

35 [실습하기 10-6] 스레드의 동기화(Synchronization) 방식 사용하지 않기 (2/5)
01  class Jv_10_6_Buffer { 02      private int data; 03      private boolean data_avail = false; 04      public int get() {    05      if (data_avail == true) { 06         data_avail = false;    07          } 08          return data;  09      } 10      public void put(int d) { 11      data = d; 12      } 13  } 14  15  class Jv_10_6_Producer extends Thread { 16      private Jv_10_6_Buffer buf; 17      private int data;    18      public Jv_10_6_Producer(Jv_10_6_Buffer b) {    19      buf = b; 20      } Jv_10_6.java

36 [실습하기 10-6] 스레드의 동기화(Synchronization) 방식 사용하지 않기 (3/5)
21      public void run() {    22      for (int i=0; i < 10; i++) { 23          data = (int)(Math.random()*1000);    24              buf.put(data); 25              System.out.println("* PRODUCER " + data); 26              try { 27          sleep((int)(Math.random()*1000)); 28              } catch (InterruptedException e) { 29              } 30          } 31      } 32  } 33  class Jv_10_6_Consumer extends Thread { 34      private Jv_10_6_Buffer bf; 35      private int data;    36      public Jv_10_6_Consumer(Jv_10_6_Buffer b) {    37      bf = b; 38      } 39      public void run() {    40      for (int i=0; i < 10; i++) { Jv_10_6.java

37 [실습하기 10-6] 스레드의 동기화(Synchronization) 방식 사용하지 않기 (4/5)
41          data = bf.get();    42              System.out.println("# consumer =>" + data); 43              try { 44          sleep((int)(Math.random()*1000)); 45              } catch (InterruptedException e) { 46              } 47          } 48      } 49  } 50  51  public class Jv_10_6 { 52      public static void main(String[] args) {    53      Jv_10_6_Buffer bbb = new Jv_10_6_Buffer(); 54          Jv_10_6_Producer td1 = new Jv_10_6_Producer(bbb); 55          Jv_10_6_Consumer td2 = new Jv_10_6_Consumer(bbb); 56          td1.start(); 57          td2.start();  58      } 59  } Jv_10_6.java

38 [실습하기 10-6] 스레드의 동기화(Synchronization) 방식 사용하지 않기 (5/5)
01행: 자바에서 스레드를 생성하는 방법에는 2가지가 있다. 여기서는 Thread 클래스를 확장한 클래스에서 Thread 클래스에 정의된 run() 메소드를 상속 받아 오버라이드하고 확장한 클래스의 스레드 객체를 생성하는 방법이다. 프로그램 구조 설명

39 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (1/7)

40 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (2/7)
01  class Jv_10_7_Buffer { 02      private int data; 03      private boolean data_avail = false; 04  05      public synchronized int get() {    06      while (data_avail == false) { 07             try { 08              wait();    09             } catch (InterruptedException e) {} 10          } 11          data_avail = false; 12          notifyAll(); 13          return data; 14      } 15  16      public synchronized void put(int d) { 17      while (data_avail == true) { 18             try { 19              wait();    20             } catch (InterruptedException e) {} 21          } Jv_10_7.java

41 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (3/7)
22          data = d; 23          data_avail = true; 24          notifyAll(); 25      } 26  } 27  28  class Jv_10_7_Producer extends Thread { 29      private Jv_10_7_Buffer buf; 30      private int data;    31      public Jv_10_7_Producer(Jv_10_7_Buffer b) {    32      buf = b; 33      } 34      public void run() {    35      for (int i=0; i < 10; i++) { 36          data = (int)(Math.random()*1000);    37              buf.put(data); 38              System.out.println("* PRODUCER " + data); 39              try { 40          sleep((int)(Math.random()*1000)); 41              } catch (InterruptedException e) { 42              } 43          } 44      } Jv_10_7.java

42 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (4/7)
45  } 46  47  class Jv_10_7_Consumer extends Thread { 48      private Jv_10_7_Buffer bf; 49      private int data;    50      public Jv_10_7_Consumer(Jv_10_7_Buffer b) {    51      bf = b; 52      } 53      public void run() {    54      for (int i=0; i < 10; i++) { 55          data = bf.get();    56              System.out.println("# consumer =>" + data); 57              try { 58          sleep((int)(Math.random()*1000)); 59              } catch (InterruptedException e) { 60              } 61          } 62      } 63  } 64  65  public class Jv_10_7 { 66      public static void main(String[] args) {  Jv_10_7.java

43 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (5/7)
67      Jv_10_7_Buffer bbb = new Jv_10_7_Buffer(); 68          Jv_10_7_Producer td1 = new Jv_10_7_Producer(bbb); 69          Jv_10_7_Consumer td2 = new Jv_10_7_Consumer(bbb); 70          td1.start(); 71          td2.start();  72      } 73  } Jv_10_7.java

44 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (6/7)
05, 16행: synchronized 키워드를 사용하면 스레드에서 동기화된 메소드가 된다. 생산자 객체가 Buffer 객체의 값을 쓰고 동안에 소비자 객체는 Buffer 객체에 접근할 수 없다. 또한 소비자 객체가 Buffer 객체의 값을 읽는 동안에 생산자 객체는 Buffer 객체에 접근할 수 없다. 즉, 어떤 객체가 접근하는 동안에는 잠금(lock)을 하여서 다른 객체가 접근하지 못하도록하고 일이 완료되면 잠금을 해제하여 다른 객체가 접근 가능하도록하는 방식을 사용한다. 06행: get() 메소드에서는 먼저 생성자 스레드가 데이터를 만들 때까지 루프(loop)를 돌면서 wait()를 호출한다.  24행: 생산자 스레드는 새로운 데이터를 만든 다음, 이를 notifyAll() 메소드를 이용해 소비자 쓰레드(Jv_10_7_Consumer 클래스에 의해서 생성된 스레드)에게 알린다. 그러면 소비자 쓰레드는 루프에서 빠져나와 data에 들어 있는 값을 반환한다. 08행: wait() 메소드는 생산자 스레드(Jv_10_7_Producer 클래스에 의해서 생성된 스레드)가 데이터를 만들었다는 통보가 오기 전까지 기다린다. 17행: put() 메소드에서는 먼저 소비자 스레드가 데이터를 소비할 때까지 루프를 돌면서 wait()를 호출한다. 프로그램 구조 설명

45 [실습하기 10-7] 스레드의 동기화(Synchronization) 방식 사용하기 (7/7)
19행: wait() 메소드는  소비자 스레드(Jv_10_7_Consumer 클래스에 의해서 생성된 스레드)가 데이터를 소비하였다는 통보가 오기 전까지 기다린다. 12행: 소비자 스레드는 데이터를 소비한 다음, 이를 notifyAll() 메소드를 이용해 생산자 스레드에게 알린다. 그러면 생산자 스레드는 루프에서 빠져나와 data에 새로운 값을 생성한다. 프로그램 구조 설명

46


Download ppt "예외 처리 및 스레드 클래스 활용 학습목표 오류 발생 시 무조건 정지하지 않고 경우에 따라서 예외 처리하여 정상 작동을 하는 경우의 Exception 클래스에 대해서 학습한다. 멀티미디어 파일에서 동시에 다운로드 받는 효과를 갖을 수 있는 스레드(Thread) 클래스에."

Similar presentations


Ads by Google