Download presentation
1
스레드 프로그래밍 Lecture #7
2
강의 목차 스레드 개념을 이해한다. Thread 클래스에서 제공하는 메소드의 종류와 기능을 알아본다.
스레드를 생성하고 실행하는 방법을 알아본다. 멀티 스레드 개념을 이해하고, 동기화 방법을 익힌다 . Mobile Programming
3
스레드 개요 (1) 스레드(Thread)란? 생각해 봅시다! 한 프로그램 내에서 독립적으로 동작하는 일의 실행 단위
한 프로그램 내에 여러 개의 스레드를 생성, 실행 가능 생각해 봅시다! paint() 메서드를 반복시키기 위한 방법? 명령어 버튼을 클릭 : 불연속 while , for, do while 문 이용 : X 스레드 이용 Mobile Programming
4
[예제 6-1] ClipAniThreadMIDlet.java
스레드 개요 (2) 스레드 이용 방법 01 import javax.microedition.midlet.*; 02 import javax.microedition.lcdui.*; 03 04 public class ClipAniThreadMIDlet extends MIDlet { 05 private Display display; 06 private ClipAniThreadCanvas canvas_; 07 public ClipAniThreadMIDlet() { display = Display.getDisplay(this); canvas_ = new ClipAniThreadCanvas(); 10 } 11 public void startApp() { display.setCurrent(canvas_); 13 } 14 public void pauseApp() { } 15 public void destroyApp(boolean unconditional) { } 16 } [예제 6-1] ClipAniThreadMIDlet.java Mobile Programming
5
[예제 6-2] ClipAniThreadCanvas.java
스레드 개요 (3) 스레드 이용 방법 … 04 class ClipAniThreadCanvas extends Canvas implements Runnable { …. private Thread thread; public ClipAniThreadCanvas() { thread = new Thread(this); thread.start(); } public void run() { while(true) { try { Thread.sleep(500); } catch(InterruptedException e) { System.out.println(e); } repaint(); } 26 } [예제 6-2] ClipAniThreadCanvas.java Mobile Programming
6
스레드 개요 (4) 스레드 구현 방법 Runnable 인터페이스를 이용한 방법 Thread 클래스를 이용한 방법
스레드 구현 방법 Runnable 인터페이스를 이용한 방법 Thread 클래스를 이용한 방법 Runnable 인터페이스 상속 스레드 선언 스레드 객체 생성 스레드 실행 run() 메소드 구현 Mobile Programming
7
스레드 개요 (5) Runnable 인터페이스를 이용한 방법
class ClipAniThreadCanvas extends Canvas implements Runnable { private Thread thread; public RunnableThreadCanvas( ) { thread = new Thread(this); thread.start( ); } public void run( ) { ... repaint( ); // paint( ) 호출 public void paint(Graphics g) { ... } ➊ ➋ ➌ ➍ ➎ Mobile Programming
8
스레드 개요 (6) Thread 클래스를 이용한 방법
Runnable 인터페이스를 이용하는 방법과 다르다. Thread 클래스를 상속받는 클래스가 필요 Thread 클래스를 이용하여 게임 프로그램을 만들기 위해서는 최소 다음과 같은 3개의 클래스가 필요 MIDlet 클래스를 상속받는 ThreadMIDlet 클래스 Canvas 클래스를 상속받는 ThreadCanvas 클래스 Thread 클래스를 상속받는 ThreadClass 클래스 Mobile Programming
9
스레드 개요 (7) MIDlet 클래스를 상속받는 ThreadMIDlet 클래스 private Display display;
public class ThreadMIDlet extends MIDlet { private Display display; private ThreadCanvas canvas; public ThreadMIDlet( ) { display = Display.getDisplay(this); canvas = new ThreadCanvas(); } public void startApp( ){ display.setCurrent(canvas); } public void pauseApp( ) { ... } public void destroyApp(boolean unconditional) { ... } ➊ ➋ ➌ Mobile Programming
10
스레드 개요 (8) Canvas 클래스를 상속받는 ThreadCanvas 클래스
class ThreadCanvas extends Canvas { ThreadClass thread_class; public ThreadCanvas( ) { thread_class = new ThreadClass(this); } public void paint(Graphics g) { ... } ➊ ➋ ➌ Mobile Programming
11
스레드 개요 (9) Thread 클래스를 상속받는 ThreadClass 클래스
class ThreadClass extends Thread { private Thread thread; ThreadCanvas thread_canvas; public ThreadClass(ThreadCanvas thread_canvas) { this.thread_canvas = thread_canvas; thread = new Thread(this); thread.start( ); } public void run( ) { ... thread_canvas.repaint(); ➊ ➋ ➌ ➍ ➎ ➏ ➐ ➑ ➒ Mobile Programming
12
[예제 6-3] ThreadMIDlet.java
스레드 개요 (10) 01 import javax.microedition.midlet.*; 02 import javax.microedition.lcdui.*; 03 04 public class ThreadMIDlet extends MIDlet { 05 private Display display; 06 private ThreadCanvas canvas; 07 public ThreadMIDlet() { display = Display.getDisplay(this); canvas = new ThreadCanvas(); 10 } 11 public void startApp() { display.setCurrent(canvas); 13 } 14 public void pauseApp() { } 15 public void destroyApp(boolean unconditional) { } 16 } [예제 6-3] ThreadMIDlet.java Mobile Programming
13
[예제 6-4] ThreadCanvas.java
스레드 개요 (11) 01 import javax.microedition.lcdui.*; 02 import java.io.*; 03 class ThreadCanvas extends Canvas { 04 private Image ani_img; 05 private int curFrame; 06 ThreadClass thread_class; 07 08 public ThreadCanvas() { try { ani_img = Image.createImage("/animation.png"); } catch(IOException e) { e.printStackTrace(); } curFrame = 0; thread_class = new ThreadClass(this); 16 } 17 public void paint(Graphics g) { g.setColor(0, 0, 0); g.drawRect(0, 0, getWidth(), getHeight()); int x = getWidth() / 2-33; int y = getHeight() / 2-27; g.setClip(x, y, 66, 54); g.drawImage(ani_img, x-(66*curFrame), y, Graphics.TOP | Graphics.LEFT); g.setClip(0, 0, getWidth(), getHeight()); this.curFrame++; if(curFrame >= 10) curFrame = 0; 27 } 28 } [예제 6-4] ThreadCanvas.java Mobile Programming
14
[예제 6-5] ThreadClass.java
스레드 개요 (12) 01 public class ThreadClass extends Thread { 02 private Thread thread; 03 ThreadCanvas thread_canvas; 04 public ThreadClass(ThreadCanvas thread_canvas) { this.thread_canvas = thread_canvas; thread = new Thread(); thread.start(); 08 } 09 public void run() { while(true) { try { thread.sleep(500); } catch(InterruptedException e) { System.out.println(e); } thread_canvas.repaint(); } 18 } 19 } [예제 6-5] ThreadClass.java Mobile Programming
15
Thread Class (1) Thread 클래스의 생성자 Mobile Programming
16
Thread Class (2) Thread 클래스의 메소드 Mobile Programming
17
Thread Class (3) 스레드 상태 전이도 Java.lang.Object 클래스에서 상속받은 메소드 생성
run( ) 실행 일시정지 정지 new start( ) yield( ) 스케줄러 wait( ) notify( ) nofifyAll( ) sleep( ) 인터럽트 Mobile Programming
18
Thread Class (4) 스레드 생성 Thread t1 = new Thread(this);
class ThreadCanvas extends Canvas { ThreadClass thread_class; public ThreadCanvas( ) { thread_class = new ThreadClass(this); Thread thread = new Thread(thread_class); thread.start(); } public void paint(Graphics g) { ... } Thread t1 = new Thread(this); Thread t2 = new Thread(this, “thread_name”); Mobile Programming
19
Thread Class (5) 스레드 상태 검사 public final boolean isAlive( )
현재 스레드가 살아있는지 확인 살아있는 상태: true 반환 종료: false 반환 public final boolean isAlive( ) Mobile Programming
20
Thread Class (6) 스레드 우선 순위 Thread.MIN_PRIORITY : 최소 우선순위 값(=1)
우선 순위 설정 및 확인 setPriority( ) 메소드 getPriority( ) 메소드 Thread.currentThread( ).setPriority(Thread.NORM_PRIORITY+2); t1.setPriority(7); Thread.currentThread().getPriority( ); Thread.MIN_PRIORITY : 최소 우선순위 값(=1) Thread.NORM_PRIORITY : 기본 우선순위 값(=5) Thread.MAX_PRIORITY : 최대 우선순위 값(=10) Mobile Programming
21
Thread Class (7) 스레드 기본 상태 전이 sleep( ) 사용 예
스레드 실행을 일시적으로 정지했다가 다시 실행시키는 메소드 sleep( ), join( ), yield( ) sleep( ) 사용 예 static void sleep(long millis) throws InterruptedException try { Thread.sleep((int)(1000)); } catch (InterruptedException e) { System.out.println(e); } Mobile Programming
22
Thread Class (8) join( ) yield( ) public final void join( )
호출한 스레드를 종료할 때까지 현재 스레드를 기다림 yield( ) 우선순위가 같은 실행 가능 상태에 있는 다른 스레드를 수행하도록 CPU를 양보 public final void join( ) throws InterruptedException public static void yield( ) Mobile Programming
23
Thread Class (9) 멀티 스레드 두 스레드 간에 발생할 수 있는 문제점
하나의 자원을 공유하면서 여러 작업을 동시 수행 두 스레드 간에 발생할 수 있는 문제점 자원 공유에 따른 상호배제(Mutual Exclusion) 해결 방법으로 스레드 동기화 기능을 제공 Mobile Programming
24
Thread Class (10) 동기화로 두 스레드 간의 문제점 해결 예제 6-6 참조
synchronized 키워드를 사용해 임계 영역 설정 예제 6-6 참조 Mobile Programming
25
스레드 실전 프로그래밍 (1) 별 애니메이션 프로그램 초기화면: 별 하나 등장 우측 버튼을 클릭하면 : 별이 하나씩 증가
초기화면: 별 하나 등장 임의의 방향으로 이동 상하 좌우 벽면에 부딪치면 튕겨져 다른 방향으로 이동 우측 버튼을 클릭하면 : 별이 하나씩 증가 좌측 버튼을 클릭하면 : 별이 하나씩 감소 상하 버튼을 클릭하면: 별의 속도 증, 감 Mobile Programming
26
스레드 실전 프로그래밍 (2) 프로그램 구성도 ThreadStarMIDlet 클래스 ThreadStarCanvas 클래스
ThreadStarClass 클래스 예제 6-7 ~6-9 참조 Midlet Canvas Thread ThreadS ThreadStarMIDlet() starApp( ) pauseApp( ) destroyApp( ) ThreadStarCanvas( ) Paint( ) keyPressed( ) ThreadStarClass( ) setStarPaint( ) slower( ) faster( ) ThreadStarMIDlet ThreadStarCanvas ThreadStarClass 1 1 1 n Mobile Programming
27
[예제 6-7] ThreadStarMIDlet.java
스레드 실전 프로그래밍 (3) 01 import javax.microedition.midlet.*; 02 import javax.microedition.lcdui.*; 03 04 public class ThreadStarMIDlet extends MIDlet { 05 private Display display; 06 private ThreadStarCanvas canvas; 07 public ThreadStarMIDlet( ) { display = Display.getDisplay(this); canvas = new ThreadStarCanvas(); 10 } 11 public void startApp( ) { display.setCurrent(canvas); 13 } 14 public void pauseApp( ) { } 15 public void destroyApp(boolean unconditional) { } 16 } [예제 6-7] ThreadStarMIDlet.java Mobile Programming
28
[예제 6-8] ThreadStarCanvas.java
스레드 실전 프로그래밍 (4) … 03 class ThreadStarCanvas extends Canvas { 04 private Image star_bg_img; 05 private int stars_num, width, height; 06 private int maxStars = 5; 07 private ThreadStarClass[] stars; 08 private ThreadStarClass thread_star_class; 09 10 public ThreadStarCanvas() { width = getWidth(); height = getHeight(); try { star_bg_img = Image.createImage("/star_bg.png"); } catch(IOException e) { e.printStackTrace(); } stars = new ThreadStarClass[maxStars]; stars[0] = new ThreadStarClass(this, 0, 0, width, height); stars_num = 1; Thread t = new Thread(stars[0]); t.start(); } [예제 6-8] ThreadStarCanvas.java Mobile Programming
29
[예제 6-8] ThreadStarCanvas.java
스레드 실전 프로그래밍 (5) 24 public void paint(Graphics g) { g.setColor(0, 0, 0); g.drawRect(0, 0, getWidth(), getHeight()); g.drawImage(star_bg_img, 0, 0, Graphics.TOP | Graphics.LEFT); for(int i=0; i < stars_num; i++) { stars[i].setStarPaint(g); } g.setColor(0xffffff); g.drawString(stars_num + "stars", 5, height-14, 0); 33 } 34 public void keyPressed(int keyCode) { int action = getGameAction(keyCode); switch(action) { case LEFT: if(stars_num > 0) { stars_num = stars_num - 1; } break; [예제 6-8] ThreadStarCanvas.java Mobile Programming
30
[예제 6-8] ThreadStarCanvas.java
스레드 실전 프로그래밍 (6) case RIGHT: if(stars_num < stars.length) { stars[stars_num] = new ThreadStarClass(this, 0, 0, width, height-12); new Thread(stars[stars_num]).start(); stars_num = stars_num + 1; } break; case UP: thread_star_class.faster(); break; case DOWN: thread_star_class.slower(); break; } repaint(); 57 } 58 } [예제 6-8] ThreadStarCanvas.java Mobile Programming
31
[예제 6-9] ThreadStarclass.java
스레드 실전 프로그래밍 (7) ... 03 public class ThreadStarClass extends Thread { 04 static java.util.Random random = new java.util.Random(); 05 static int[][] matrix = {{1,-1, -1, 1, 1, 1}, {-1,-1, 1, 1, -1, 1}, null, {1, 1, -1, -1, 1, -1}, {-1, 1, 1, -1, -1, -1}}; 06 static int delay = 20; 07 Image star_image; 08 public int top, left, width, height; 09 public int posX, posY; 10 public int star_radius = 10; 11 public int deltaX, deltaY; 12 Canvas canvas; 13 public ThreadStarClass(Canvas c, int left, int top, int width, int height) { canvas = c; this.left = left; this.top = top; this.width = width - (2 * star_radius + 2); this.height = height - (2 * star_radius + 2); this.posX = (random.nextInt()>>>1) % (this.width-20) + 10; this.posY = (random.nextInt()>>>1) % (this.height-20) + 10; deltaX = random.nextInt() & 1; deltaY = random.nextInt() & 1; [예제 6-9] ThreadStarclass.java Mobile Programming
32
[예제 6-9] ThreadStarclass.java
스레드 실전 프로그래밍 (8) try { star_image = Image.createImage("/star.png"); } catch(Exception e) { System.out.println("Image Loading Fail"); } } 29 public void run() { System.out.println("getName= " + Thread.currentThread().getName()); int right = left + width; int bottom = top + height; while(true) { int direction = deltaX + deltaY; if(direction == 0) direction = deltaX + 2*deltaY; int collision = 0; if(posX <= left || posX >= right) collision++; if(posY <= top || posY >= bottom) collision += 2; if(collision != 0) { collision = (collision - 1) * 2; deltaX = matrix[direction+2][collision]; deltaY = matrix[direction+2][collision+1]; } [예제 6-9] ThreadStarclass.java Mobile Programming
33
[예제 6-9] ThreadStarclass.java
스레드 실전 프로그래밍 (9) posX = posX + deltaX; posY = posY + deltaY; canvas.repaint(); try { Thread.sleep(delay); } catch(InterruptedException e) { } } 51 } 52 void setStarPaint(Graphics g) { g.drawImage(star_image,posX,posY,Graphics.TOP|Graphics.LEFT); 54 } 55 static void slower() { delay += 10; if(delay > 100) delay = 100; 58 } 59 static void faster() { delay -= 10; if(delay < 0) delay = 0; 62 } 63 } [예제 6-9] ThreadStarclass.java Mobile Programming
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.