쉽게 풀어쓴 C 프로그래밍

Similar documents
제11장 프로세스와 쓰레드

PowerPoint Presentation

(Microsoft PowerPoint - java2-lecture6.ppt [\310\243\310\257 \270\360\265\345])

Microsoft PowerPoint - java2-lecture6.ppt [호환 모드]

Microsoft PowerPoint - lec12 [호환 모드]

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

PowerPoint Presentation

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

비긴쿡-자바 00앞부속

Microsoft PowerPoint - 04-UDP Programming.ppt

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

스레드의우선순위 우선순위설정메소드 : void setpriority(int newpriority) newpriority 에설정할수있는등급 : 1( 가장낮은우선순위 ) 부터 10( 가장높은우선순위 ) 가장높은우선순위 : MAX_PRIORITY, 보통우선순위 : NORM_

gnu-lee-oop-kor-lec06-3-chap7

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

스레드를적용하지않은결과와스레드를적용한결과의비교 1) 두개의작업을스레드를사용하지않고수행한예 ) : 순차작업 class ThreadTest2 { System.out.print("-");// 화면에 - 를출력하는작업 System.out.print(" ");// 화면에 를출력

PowerPoint Presentation

JAVA PROGRAMMING 실습 09. 예외처리

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Design Issues

<4D F736F F F696E74202D20C1A63233C0E520B1D7B7A1C7C820C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - Java7.pptx

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

02 C h a p t e r Java

PowerPoint Presentation

Microsoft PowerPoint - RMI.ppt

Cluster management software

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

쉽게

슬라이드 1

Microsoft PowerPoint - 2강

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밊

rmi_박준용_final.PDF

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

JMF3_심빈구.PDF

gnu-lee-oop-kor-lec10-1-chap10

Microsoft PowerPoint - 14주차 강의자료

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

<4D F736F F F696E74202D20C1A63236C0E520BED6C7C3B8B428B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63234C0E520C0D4C3E2B7C228B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint Presentation

untitled

Network Programming

12-file.key

오버라이딩 (Overriding)

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

5장.key

Microsoft PowerPoint - 03-TCP Programming.ppt

PowerPoint 프레젠테이션

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Chap12

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍

PowerPoint Presentation

JUNIT 실습및발표

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A63230C0E520BDBAC0AE20C4C4C6F7B3CDC6AE203128B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - Lect04.pptx

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

PowerPoint Presentation

10장.key

11장.key

Microsoft Word - java18-1-final-answer.doc

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 02. 표준 입출력

JTable과 MVC(Model-View-Controller) 구조 - 모델-뷰-컨트롤러구조는데이터의저장과접근에대한제공은모델이담당하고, 화면표시는뷰, 이벤트의처리는컨트롤러가하도록각역할을구분한구조이다. 즉, 역할의분담을통하여상호간의영향을최소화하고각요소의독립성을보장하여독자

Microsoft PowerPoint - CSharp-10-예외처리

Java Programing Environment

Microsoft Word - java19-1-midterm-answer.doc

신림프로그래머_클린코드.key

05-class.key

PowerPoint Template

C++ Programming

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

교육자료

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

Spring Boot

PowerPoint Presentation

TEST BANK & SOLUTION

4장.문장

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint Presentation

예외 예외정의예외발생예외처리예외전파 단정 단정의선언 단정조건검사옵션 2

JMF2_심빈구.PDF

Transcription:

Power Java 제 23 장스레드

이번장에서학습할내용 스레드의개요 스레드의생성과실행 스레드상태 스레드의스케줄링 스레드간의조정 스레드는동시에여러개의프로그램을실행하는효과를냅니다.

멀티태스킹 멀티태스킹 (muli-tasking) 는여러개의애플리케이션을동시에실행하여서컴퓨터시스템의성능을높이기위한기법

스레드란? 다중스레딩 (multi-threading) 은하나의프로그램이동시에여러가지작업을할수있도록하는것 각각의작업은스레드 (thread) 라고불린다.

프로세스와스레드 프로세스 (process): 자신만의데이터를가진다. 스레드 (thread): 동일한데이터를공유한다.

스레드를사용하는이유 웹브라우저에서웹페이지를보면서동시에파일을다운로드할수있도록한다. 워드프로세서에서문서를편집하면서동시에인쇄한다. 게임프로그램에서는응답성을높이기위하여많은스레드를사용한다. GUI 에서는마우스와키보드입력을다른스레드를생성하여처리한다.

중간점검문제 1. 스레드와프로세스의결정적인차이점은무엇인가? 2. 스레드를사용해야만하는프로그램을생각하여보자. 3. 다중스레딩에서발생할수있는문제에는어떤것들이있을까? 추측하여보라.

스레드생성과실행 스레드는 Thread 클래스가담당한다. Thread t = new Thread(); // 스레드객체를생성한다. t.start(); // 스레드를시작한다. 스레드의작업은 Thread 클래스의 run() 메소드안에기술한다.

스레드를생성하는방법 Thread 클래스를상속하는방법 스레드생성방법 Thread 클래스를상속받은후에 run() 메소드를재정의한다. Runnable 인터페이스를구현하는방법 run() 메소드를가지고있는클래스를작성하고, 이클래스의객체를 Thread 클래스의생성자를호출할때전달한다.

Thread 클래스를상속하는방법 전체적인구조 class MyThread extends Thread { public void run() { // 여기에작업을기술 Thread t = new MyThread(); t.start(); 일수를알고싶은달을입력하시오 :6 월의날수는 30

Thread 클래스를상속하는방법 class MyThread extends Thread { public void run() { for (int i = 10; i >= 0; i--) System.out.print(i + " "); public class MyThreadTest { public static void main(string args[]) { Thread t = new MyThread(); t.start(); 10 9 8 7 6 5 4 3 2 1 0

Runnable 인터페이스를구현하는방법 class MyRunnable implements Runnable { public void run() {... Thread t = new Thread(new MyRunnable()); t.start(); Thread 객체 = 일꾼 Runnable 객체 = 작업의내용

Thread 클래스를상속하는방법 class MyRunnable implements Runnable { public void run() { for (int i = 10; i >= 0; i--) System.out.print(i + " "); public class MyRunnableTest { public static void main(string args[]) { Thread t = new Thread(new MyRunnable()); t.start(); 10 9 8 7 6 5 4 3 2 1 0

어떤방법이좋은가? 자바에서다중상속이불가능한것을감안한다면 Runnable 인터페이스를사용하는것도좋다. 다중상속이필요없는간단한내용은 Thread 상속이좋다. Runnable 인터페이스를사용하면고수준의스레드관리 API 도사용할수있다. Runnable 구현 Thread 상속

예제 class MyRunnable implements Runnable { String myname; public MyRunnable(String name) { myname = name; public void run() { for (int i = 10; i >= 0; i--) System.out.print(myName + i + " "); public class TestThread { public static void main(string[] args) { Thread t1 = new Thread(new MyRunnable("A")); Thread t2 = new Thread(new MyRunnable("B")); t1.start(); t2.start();

예제 A10 B10 A9 B9 B8 A8 B7 B6 A7 B5 A6 B4 A5 B3 A4 A3 A2 B2 A1 B1 A0 B0

예제... public class CountDownTest extends JFrame { private JLabel label; class MyThread extends Thread { public void run() { for (int i = 10; i >= 0; i--) { try { Thread.sleep(1000); catch (InterruptedException e) { e.printstacktrace(); label.settext(i + "");

예제 public CountDownTest() { settitle(" 카운트다운 "); setsize(300, 200); setdefaultcloseoperation(jframe.exit_on_close); label = new JLabel("Start"); label.setfont(new Font("Serif", Font.BOLD, 100)); add(label); (new MyThread()).start(); setvisible(true); public static void main(string[] args) { CountDownTest t = new CountDownTest();

예제 : 자동차경주... public class CarGame extends JFrame { private JLabel label1; private JLabel label2; private JLabel label3; int x1 = 100, x2= 100, x3 = 100; class MyThread extends Thread { public void run() { for (int i = 0; i < 120; i++) { try { Thread.sleep(100); catch (InterruptedException e) { e.printstacktrace(); x1 += (int) (Math.random() * 10); label1.setbounds(x1, 0, 100, 100); x2 += (int) (Math.random() * 10); label2.setbounds(x2, 50, 100, 100); x3 += (int) (Math.random() * 10); label3.setbounds(x3, 100, 100, 100);

public CarGame() { settitle("carrace"); setsize(600, 200); setdefaultcloseoperation(jframe.exit_on_close); setlayout(null); label1 = new JLabel(); label1.seticon(new ImageIcon("car1.gif")); label2 = new JLabel(); label2.seticon(new ImageIcon("car2.gif")); label3 = new JLabel(); label3.seticon(new ImageIcon("car3.gif")); add(label1); add(label2); add(label3); label1.setbounds(100, 0, 100, 100); label2.setbounds(100, 50, 100, 100); label3.setbounds(100, 100, 100, 100); (new MyThread()).start(); setvisible(true); public static void main(string[] args) { CarGame t = new CarGame();

실행결과

중간점검문제 1. 스레딩을담당하는클래스의이름은? 2. Thread 를상속받는방법의문제점은무엇인가?

Thread 클래스 메소드 Thread() Thread(String name) 설명 매개변수가없는기본생성자 이름이 name 인 Thread 객체를생성한다 Thread(Runnable target, String name) Runnable 을구현하는객체로부터스레드를생성한다. static int activecount() 현재활동중인스레드의개수를반환한다. String getname() int getpriority() 스레드의이름을반환 스레드의우선순위를반환 void interrupt() 현재의스레드를중단한다. boolean isinterrupted() 현재의스레드가중단될수있는지를검사 void setpriority(int priority) 스레드의우선순위를지정한다. void setname(string name) 스레드의이름을지정한다. static void sleep(int milliseconds) 현재의스레드를지정된시간만큼재운다. void run() 스레드가시작될때이메소드가호출된다. 스레드가하여야하는 작업을이메소드안에위치시킨다. void start() 스레드를시작한다. static void yield() 현재스레드를다른스레드에양보하게만든다.

스레드상태

예제 : sleep() public class SleepTest { public static void main(string args[]) throws InterruptedException { String messages[] = { "Pride will have a fall.", "Power is dangerous unless you have humility.", "Office changes manners.", "Empty vessels make the most sound." ; for (int i = 0; i < messages.length i++) { Thread.sleep(1000); System.out.println(messages[i]); Pride will have a fall. Power is dangerous unless you have humility. Office changes manners. Empty vessels make the most sound.

인터럽트 인터럽트 (interrupt) 는하나의스레드가실행하고있는작업을중지하도록하는메카니즘이다. for (int i = 0; i < messages.length; i++) { try { Thread.sleep(1000); catch (InterruptedException e) { // 인터럽트를받은것이다. 단순히리턴한다. return; System.out.println(messages[i]);

조인 join() 메소드는하나의스레드가다른스레드의종료를기다리게하는메소드 t.join();

예제 public class ThreaControl { static void print(string message) { String threadname = Thread.currentThread().getName(); System.out.format("%s: %s%n", threadname, message); private static class MessageLoop implements Runnable { public void run() { String messages[] = { "Pride will have a fall.", "Power is dangerous unless you have humility.", "Office changes manners.", "Empty vessels make the most sound." ; try { for (int i = 0; i < messages.length i++) { print(messages[i]); Thread.sleep(2000); catch (InterruptedException e) { print(" 아직끝나지않았어요!");

예제 public static void main(string args[]) throws InterruptedException { int tries = 0; print(" 추가적인스레드를시작합니다."); Thread t = new Thread(new MessageLoop()) t.start(); print(" 추가적인스레드가끝나기를기다립니다."); while (t.isalive()) { print(" 아직기다립니다."); t.join(1000); tries++; if (tries > 2) { print(" 참을수없네요!"); t.interrupt(); t.join(); print(" 메인스레드종료!");

실행결과 main: 추가적인스레드를시작합니다. main: 추가적인스레드가끝나기를기다립니다. main: 아직기다립니다. Thread-0: Pride will have a fall. main: 아직기다립니다. main: 아직기다립니다. Thread-0: Power is dangerous unless you have humility. main: 참을수없네요! Thread-0: 아직끝나지않았어요! main: 메인스레드종료!

중간점검문제 1. setprioroty() 와 getpriority() 의역할은? 2. sleep() 메소드는어떤경우에사용되는가? 3. 어떤스레드가가장우선적으로실행되는가? 4. Thread의 run() 메소드의역할은? 5. Thread의 start(), stop() 메소드의역할은? 6. 어떤일이발생하면스레드가실행중지상태로가는가?

동기화 동기화 (synchronization): 한번에하나의스레드만이공유데이터를접근할수있도록제어하는것이필요

동기화기법 동기화란쉽게설명하면공유된자원중에서동시에사용하면안되는자원을보호하는도구이다.

스레드간섭 스레드간섭 (thread interference) 이란서로다른스레드에서실행되는두개의연산이동일한데이터에적용되면서서로겹치는것을의미 ( 예 ) 카운터 class Counter { private int value = 0; public void increment() { value++; public void decrement() { value--; public void printcounter() { System.out.println(value);

문제발생 다음과같은상황을가정하자. 4 개의스레드가하나의카운터를증가했다가다시감소한다.

예제 class MyThread extends Thread { Counter sharedcounter; public MyThread(Counter c) { this.sharedcounter = c; public void run() { int i = 0; while (i < 20000) { sharedcounter.increment(); sharedcounter.decrement(); if (i % 40 == 0) sharedcounter.printcounter(); try { sleep((int) (Math.random() * 2)); catch (InterruptedException e) { i++;

예제 public class CounterTest { public static void main(string[] args) { Counter c = new Counter(); new MyThread(c).start(); new MyThread(c).start(); new MyThread(c).start(); new MyThread(c).start();... -7-7 -7-8 -7-7...

잘못된결과가나오는이유 만약스레드 A 가 increment() 를호출하고동시에스레드 B 가 decrement() 를호출하였다고가정하자. 1 스레드 A: 변수 value의현재값을가져온다. 2 스레드 B: 변수 value의현재값을가져온다. 3 스레드 A: 가져온값을 1증가한다. 증가된값은 1이된다. 4 스레드 B: 가져온값은 1감소한다. 감소된값은 -1이된다. 5 스레드 A: value에값을저장한다. value는 1이된다. 6 스레드 B: value에값을저장한다. value는 -1이된다.

동기화된메소드 동기화된메소드를만들기위해서는 synchronized 키워드를메소드선언에붙이면된다. synchronized 키워드가붙어있으면하나의스레드가공유메소드를실행하는동안에다른스레드는공유메소드를실행할수없다. class Counter { private int value = 0; public synchronized void increment() { value++; public synchronized void decrement() { value--; public synchronized void printcounter() { System.out.println(value);

실행결과 0 0 0 0 0 1 0 0...

스레드간의조정 만약두개의스레드가데이터를주고받는경우에발생

스레드간의조정방법

스레드간의조정방법 Polling public void badmethod() { // CPU 시간을엄청나게낭비한다. // 절대해서는안된다! while(!condition) { System.out.println(" 조건이만족되었습니다!"); Event-driven public synchronized goodmethod() { while(!condition) { try { wait(); catch (InterruptedException e) { System.out.println(" 조건이만족되었습니다!");

wait() 와 notify()

생산자 / 소비자문제에적용

생산자 / 소비자문제 생산자는데이터를생산하고소비자는데이터를가지고어떤작업을한다. 생산자 - 소비자문제에서중요한것은생산자가생산하기전에소비자가물건을가져가면안된다. 반대로이전물건을소비하기전에생산하면안된다.

예제 class Buffer { private int data; private boolean empty = true; public synchronized int get() { while (empty) { try { wait(); catch (InterruptedException e) { empty = true; notifyall(); return data;

예제 public synchronized void put(intdata) { while (!empty) { try { wait(); catch (InterruptedException e) { empty = false; this.data = data; notifyall();

생산자 class Producer implements Runnable { private Buffer buffer; public Producer(Buffer buffer) { this.buffer= buffer; public void run() { for (int i = 0; i < 10; i++) { buffer.put(i); System.out.println(" 생산자 : " + i + " 번케익을생산하였습니다."); try { Thread.sleep((int) (Math.random() * 100)); catch (InterruptedException e) {

소비자 class Consumer implements Runnable { private Buffer buffer; public Consumer(Buffer drop) { this.buffer= drop; public void run() { for (int i = 0; i < 10; i++) { int data = buffer.get(); System.out.println(" 소비자 : " + data + " 번케익을소비하였습니다."); try { Thread.sleep((int) (Math.random() * 100)); catch (InterruptedException e) {

예제 public class ProducerConsumerTest { public static void main(string[] args) { Buffer buffer = new Buffer(); (new Thread(new Producer(buffer))).start(); (new Thread(new Consumer(buffer))).start(); 생산자 : 0 번케익을생산하였습니다. 소비자 : 0 번케익을소비하였습니다. 생산자 : 1 번케익을생산하였습니다. 소비자 : 1 번케익을소비하였습니다.... 생산자 : 9 번케익을생산하였습니다. 소비자 : 9 번케익을소비하였습니다.

중간점검문제 1. wait() 와 notify() 메소드는왜필요한가? 2. wait() 는어떤역할을하는가? 3. notify() 는어떤역할을하는가?

Q & A