10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성

Slides:



Advertisements
Similar presentations
Chap02 자바환경과 자바 프로그램 Section 1 : 자바 개발 환경 Section 2 : 자바 통합 환경 Section 3 : 자바 응용 프로그램과 애플릿 프로그램 Section 4 : 자바 응용 프로그램 Section 5 : 자바 애플릿 프로그램.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
6장 java.applet.Applet의 네트워크 메쏘드들
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
어서와 Java는 처음이지! 제4장 배열.
명품 JAVA Programming 제 13 장 스레드와 멀티태스킹.
명품 JAVA Essential.
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
어서와 Java는 처음이지! 제16장 스레드.
자바란 무엇인가? JDK의 다운로드 및 설치 방법 Hello, Java 프로그램의 작성 자바 프로그램의 작동 원리
Java 10장. 다중 스레드 public class SumTest {
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
제7장 제어구조 I – 식과 문장.
[ 단원 08 ] 예외처리와 스레드.
명품 JAVA Programming.
메소드 호출과 힙 원격 메소드 호출 서블릿 엔터프라이즈 자바 빈즈
명품 JAVA Programming 제 4 장 클래스와 객체.
10장 객체-지향 프로그래밍 II ©창병모.
8장 자바 입출력.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
실전 사운드 처리 프로그래밍 Lecture #11.
명품 Java Programming.
Java의 정석 제 12 장 쓰레드(thread) Java 정석 남궁성 강의
제 11 장 java.lang 패키지 제 12 장 문자열 제 13 장 유틸리티 제 14 장 입출력 제 15 장 네트워킹
최용술 장 Thread 최용술
명품 JAVA Essential.
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
Chap08 다중 스레드 8.1 스레드 개요 8.2 Thread 클래스와 스레드 생명주기 8.3 스레드 생성과 사용
DataScience Lab. 박사과정 김희찬 (월)
주소록 프로그램.
6장 객체-지향 설계 ①.
상속과 인터페이스 클래스의 상속에 대하여 인터페이스에 대하여.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
제1장 서론.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Java 8장. 상속 public class SumTest {
6장 객체-지향 설계 ①.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
DataScience Lab. 박사과정 김희찬 (월)
Subject : Thread Written by: 김형근,류명운.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
WAP Java Seminar
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
Chap10 다중 스레드 Section 1 : 스레드 개요 Section 2 : Thread 클래스와 스레드 생명주기
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
Java Chapter 4 ~ 주차.
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
프로그래머를 위한 첫걸음 JDBC Lecture 001 BY MINIO
JA A V W. 04.
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
제8장 쓰레드 프로그래밍.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
C# 10장. 참조형.
자바 프로그래밍 Thread를 이용한 애니메이션 서울호서전문학교 게임프로그램개발과.
Java 5장. 객체지향 개념 public class SumTest {
11장 다형성과 추상 클래스, 인터페이스 Section 1 객체의 형 변환 Section 2 연산자 Section 3 다형성
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
1. 객체-지향 프로그래밍.
Chapter8 : 인터페이스와 패키지 8.1 인터페이스 개요와 인터페이스 정의 8.2 인터페이스의 사용
임베디드 프로그래밍 Lecture #
Presentation transcript:

10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성 10.4 동기화(Synchronization) 10.5 스레드 사이의 통신

10.1 스레드 개요 프로세스 : 실행중인 프로그램 스레드 순차적으로 동작하는 문장들의 단일 집합 경량(lightweight) 프로세스 다중 스레드 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성하여 실행할 때 자바는 스레드를 지원하기 위해 java.lang.Thread 클래스 제공

스레드 개요 - 다중 스레드 두개의 스레드 하나의 프로그램

스레드 개요 - 스레드 생명주기 스레드의 생명주기 start() 스레드는 탄생하고 소멸될 때까지 생명주기(life cycle)를 가진다 완료 실행상태 sleep(), wait(), suspend(), 입출력 등 실행가능 상태 대기 생성 start() notify(), notifyAll(), resume(), 입출력 완료 등 스레드의 생명주기

10.2 Thread 클래스 JDK는 스레드를 지원하는 java.lang.Thread 클래스 제공 스레드를 생성하기 위해 사용 4개의 생성자를 제공 Thread() Thread(String s) Thread(Runnable r) Thread(Runnable r, String s)

Thread 클래스의 메소드 void sleep(long msec) msec에 지정된 밀리초(milliseconds) 동안 대기 throws InterruptedException 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() 스레드가 끝날 때까지 대기 void run() 스레드가 실행할 부분을 기술하는 메소드. 하위 클래스에서 오버라이딩 되어야 한다 void suspend() 스레드가 일시 정지된다. resume()에 의해 다시 시작될 수 있다. void resume() 일시 정지된 스레드를 다시 시작시킨다.

10.2 스레드의 생성 스레드를 생성하는 2가지 방법 Thread 클래스로부터 직접 상속받아 스레드를 생성 Runnable 인터페이스를 사용하는 방법(현재의 클래스가 이미 다른 클래스로부터 상속 받고 있는 경우)

스레드의 생성 - Thread 클래스 이용 Thread 클래스로부터 직접 상속 받아 스레드를 생성 Thread 클래스에서 제공되는 run() 메소드를 오버라이딩하여 스레드의 동작을 기술 class ThreadA extends Thread { // Thread 클래스로부터 상속 ......... public void run() { .... // 상위 클래스인 Thread 클래스의 run() 메소드를 오버 .... //라 이딩하여 스레드가 수행하여야 하는 문장들을 기술 } ....… ThreadA ta = new ThreadA(); ta.start(); // 스레드 객체를 생성하여 스레드를 // 시작시킨다

스레드의 생성 - Runnable 인터페이스 이용 Runnable 인터페이스는 JDK에 의해 제공되는 라이브러리 인터페이스이다 Runnable 인터페이스에는 run() 메소드만 정의되어 있다 public interface Runnable { public void run(); }

스레드의 생성 - Runnable 인터페이스 이용 이미 Applet 클래스로부터 상속을 받고 있으므로 인터페이스 이용 class RunnableB extends Applet implements Runnable { ......… public void run() { ........ // Runnable 인터페이스에 정의된 run() 메소드를 ........ // 오버라이딩하여 스레드가 수행할 문장들을 기술한다 } .....…

스레드의 생성 - Runnable 인터페이스 이용 RunnableB rb = new RunnableB(); // 객체 rb 생성 Thread tb = new Thread(rb); // rb를 매개변수로 하여 스레드 객체 tb를 생성 tb.start(); // 스레드 시작 또는 RunnableB rb = new RunnableB(); new Thread(rb).start(); // 스레드 객체를 생성하여 바로 시작

예제1) 200초마다 하나의 문장씩 출력하는 예제 class ThreadTest extends Thread{ public void run(){ try{ for (int j=0;j<10;j++){ Thread.sleep(200); System.out.println(“Easy Java :”+j); } catch(InterruptedException e){ System.out.println(e); Class ThreadfromThread { public static void main(String args[]){ ThreadTest t = new ThreadTest(); t.start();

예제2) Runnable 인터페이스를 이용한 동일한 예제 class RunnableTest implements Runnable{ public void run(){ try{ for (int j=0;j<10;j++){ Thread.sleep(200); System.out.println(“Easy Java :”+j); } catch(InterruptedException e){ System.out.println(e); Class ThreadfromRunnable { public static void main(String args[]){ RunnableTest r = new RunnableTest(); Thread t = new Thread(r); t.start();

예제3) 하나의 스레드 클래스로부터 두개의 스레드 객체를 생성하는 예제 class ThreadTest extends Thread { public ThreadTest(string str){ super(str); } public void run(){ try{ for (int j=0;j<10;j++){ Thread.sleep(2); System.out.println(j+getName()); System.out.println(“끝”+getName()); catch(InterruptedException e){ System.out.println(e); Class ThreadDouble { public static void main(String args[]){ ThreadTest t1 = new ThreadTest(“ 스레드 1”); ThreadTest t2 = new ThreadTest(“ 스레드 2”); t1.start(); t2.start();

10.4 동기화(Synchronization) 대부분의 응용 프로그램에서 다수개의 스레드가 공유할 수 있는 부분이 요구된다 공유부분은 상호 배타적으로 사용되어야 한다 임계영역(critical section) 상호배타적으로 사용되는 공유부분 자바는 한 순간에 하나의 스레드만 실행할 수 있는 synchronized method 제공 한 스레드가 synchronized method를 수행 중이면 다른 스레드는 대기한다

동기화(Synchronization) - synchronized method 수행 시간 t0 lock을 얻는다 t1 lock을 요청하지만 이미 t2 사용중이므로 기다린다 t3 t4 lock을 양보한다 t5 lock을 얻는다 t6 t7 t8 t9 lock을 양보한다 synchronized method 스레드A 스레드B ……… ……………….. 임계영역 문장들

예제1) 경매 시스템의 경매 DB구현, 5명이 50만원이 될 때까지 1000원씩 경쟁 class Account { private int total = 0; synchronized void deposit(int amount){ total += amount; } int gettotal(){ return total; class Customer extends Thread { Account account1; Customer(Account account){ this.account1 = account; public void run(){ try{ for (int j=0; j<200;j++){ System.out.println(“경매자 ”+getName()+” : “+j+”번째”); account1.deposit(1000); sleep(2); if (account1.gettotal() >= 500000) break; catch(Exception e){ System.out.println(e);

class Auction { public static void main(String args[]){ Account account = new Account(); Customer customers[] = new Customer[5]; for (int j=0; j<5; j++){ customers[I] = new Customer(account); customers[I].start(); } for (int j=0; j<5;j++){ try{ customers[I].join(); catch(InterruptedException e){ System.out.println(e); System.out.println(“경매 낙찰가 : “+account.gettotal());

10.5 스레드 사이의 통신 java.lang.Object 클래스에서는 스레드 사이의 통신을 위해 3개의 메소드를 제공 wait() 메소드 : 스레드 수행중 이 메소드를 만나면 가지고 있는 lock을 양보하고 대기상태로 들어간다 void wait() throws InterruptedException => notify() void wait(long msec) throws InterruptedException void wait(long msec, int nsec) throws InterruptedExceptionvoid msec와 nsec는 대기 시간을 의미

스레드 사이의 통신 notify() : 대기 상태의 스레드중에서 하나의 스레드를 깨운다 notifyAll() : 대기 상태의 모든 스레드를 깨운다 void notify() void notifyAll() Synchronized 메소드내에서 일반적으로 사용됨 그러나 문장이 호출된 시점에서 현재의 스레드가 lock을 가지고 있으므로 synchronized()메소드를 벗어나는 시점에서 사용

예제) 생산자/소비자 빵집아저씨 손님 바게트 빵집

예제1) 생산자/소비자의 관계 구현 class Producer extends Thread { private Buffer blank; private int number = 10; public Producer(Buffer blank, int number){ this.blank = blank; this.number = number; } public void run(){ for (int j=0; j<10;j++){ blank.put(j); System.out.println(“생산자 : 생산 “+j); try{ sleep((int)(Math.random()*100)); catch(InterruptedException e){ System.out.println(e); class Consumer extends Thread { private Buffer blank; private int number; public Consumer(Buffer c, int number){ blank = c; this.number = number; } public void run(){ int val = 0; for (int j=0; j<10;j++){ val = blank.get(j); System.out.println(“소비자 : 소비 “+val);

class Buffer { private int contents; private boolean available = false; public synchronized int get(){ while (available == false){ try{ wait(); } catch(InterruptedException e){} available = false; notifyAll(); return contents; public synchronized int put(int value){ while (available == true){ contents = value; available = true; public class ProducerConsumer { public static void main(String args[]){ Buffer c = new Buffer(); Producer p1 = new Producer(c,1); Consumer c1 = new Consumer(c,1); p1.start(); c1.start(); }