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

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

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

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

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

PowerPoint Presentation

Microsoft PowerPoint - CSharp-10-예외처리

오버라이딩 (Overriding)

PowerPoint Presentation

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

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

PowerPoint Template

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

설계란 무엇인가?

PowerPoint Presentation

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

JAVA PROGRAMMING 실습 02. 표준 입출력

Microsoft PowerPoint App Fundamentals[Part1].pptx

서현수

PowerPoint Presentation

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

PowerPoint 프레젠테이션

Microsoft PowerPoint - lec12 [호환 모드]

JVM 메모리구조

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

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

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

DLL(Dynamic Linked Library)

쉽게 풀어쓴 C 프로그래밍

2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim();

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63139C0E520B9E8C4A120B0FCB8AEC0DA28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

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

C++ Programming

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

Design Issues

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

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

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

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

Flex Builder 2 & 차트

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

Cluster management software

Network Programming

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 2강

Slide 1

쉽게 풀어쓴 C 프로그래밍

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

Spring Boot/JDBC JdbcTemplate/CRUD 예제

JUNIT 실습및발표

금오공대 컴퓨터공학전공 강의자료

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

17장 클래스와 메소드

Microsoft Word - PLC제어응용-2차시.doc

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

제목

PowerPoint Presentation

C++ Programming

MVVM 패턴의 이해

<4D F736F F F696E74202D20C1A63138C0E520C0CCBAA5C6AE20C3B3B8AE28B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Spring Boot

Slide 1

슬라이드 1

소프트웨어공학개론 강의 11: UML 코드매핑 최은만동국대학교컴퓨터공학과

ThisJava ..

Microsoft PowerPoint - 06-Chapter09-Event.ppt

콘텐츠 PowerPoint 디자인

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

No Slide Title

Microsoft PowerPoint - C++ 5 .pptx

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

쉽게 풀어쓴 C 프로그래밍

어댑터뷰

No Slide Title

Microsoft PowerPoint - Lect04.pptx

Microsoft PowerPoint - Chapter 6.ppt

PowerPoint 프레젠테이션

게시판 스팸 실시간 차단 시스템

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

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

Microsoft PowerPoint - Chap12-OOP.ppt

UX410 SAP Fiori UI 개발. 과정개요 과정버전 : 02 학습시간 : 5 일

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

슬라이드 1

[Brochure] KOR_TunA

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

윈도우시스템프로그래밍

No Slide Title

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

Microsoft PowerPoint - 13_UMLCoding(2010).pptx

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - web-part02-ch15-문서객체조작.pptx

2장 변수와 프로시저 작성하기

Transcription:

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요소로써안드로이드시스템에서는 Activities, Services, Content Providers, Broadcast Receivers 라는네가지유형의컴포넌트있습니다. - 프로세스 ( process ) 응용프로그램이메모리에로드되어실행가능한상태로재구성된것을말합니다. 즉, 응용프로그램이실행되면프로세스가된다고생각하면됩니다. 그런데응용프로그램은여러개의컴포넌트들로구성되어있기때문에컴포넌트가실행되어도프로그램이실행되는것과동일합니다. 하지만안드로이드시스템은동일한프로그램에대해서하나의프로세스로유지하기때문에컴포넌트가실행된다고해서반드시프로세스가생성되지는않습니다. 일반적으로스레드는프로세스내에서실행되고있는흐름을말합니다. 기본적으로프로세스가생성되면하나의스레드가같이생성되는데이것을메인스레드라고합니다. 이스레드는동일프로세스내에실행되는모든컴포넌트를직접실행하며 UI 에서수행되는그리기작업이나컨트롤들에대한모든이벤트들을직접처리합니다. 이와같은특징때문에메인스레드를 UI 스레드라고도합니다. 이처럼메인스레드는프로세스내에서기본적으로많은일을처리하기때문에많은리소스를필요로하거나반복적인작업을오랫동안지속해야하는경우에는어떤이벤트나작업도처리하지못하는응용프로그램응답없음상태에종종빠지기도합니다.

그래서프로그램에부하를주는작업을하는경우에는메인스레드가아닌다른스레드에서해당작업을수행할수있도록별도의스레드를생성하는것을권장하고있습니다. 하지만이렇게스레드를추가해서사용하게되면스레드간충돌에대해서안드로이드시스템이안전을보장하지않기때문에프로그래머는아래와같은 2 가지사항을주의해야합니다. - 메인스레드에긴작업시간을요구하는작업을시켜서는안된다. 메인스레드가반응하지못하는상태에빠지면해당프로그램은응답없음상태를피할수없다. - 추가된스레드에서는 UI 관련함수 (Android UI toolkit) 를직접사용하면안된다. 반드시메인스레드에원하는작업의수행을요청해야한다. 2. 스레드생성하기 응용프로그램에서스레드를추가하여사용한다는것은내가원하는루틴이메인스레드와동시에수행된다는의미입니다. 스레드를추가할때에는 Thread 클래스를사용하는데이클래스내부에는사용자가원하는작업을미리정의해둘수없기때문에 Runnable 이라는인터페이스를사용하여해당인터페이스의 run 메소드를통해작업을정의하도록하고있습니다. Runnable 인터페이스는유일하게 run 메소드만정의하여사용하도록하고있으며 Thread 클래스또한이인터페이스를가지고있습니다. 그래서 Thread 클래스를상속받는사용자정의클래스를만들거나 Thread 객체를생성하면서클래스내의 run 메소드를직접재정의하기도하고, Thread 객체를생성할때생성자에 run 메소드가정의된 Runnable 객체를인자로넘겨주기도합니다. 지금까지설명한스레드를추가하는방법에대하여자세하게알아보도록하겠습니다. ( Thread 클래스를상속받는클래스를만들어서 run 메소드를정의하는방법은제외하였습니다. ) 2.1 Runnable 객체를멤버변수로선언하여 Thread 에설정하기 Runnable 객체를멤버변수로선언하고, run 메소드를미리정의해두어서 Thread 객체를생성할때객체생성자에선언해둔 Runnable 멤버변수를인자로넘겨줍니다. // Runnable 객체를생성하고 run 메소드정의한다. Private Runnable m_run_code = new Runnable() ; // Thread 객체를생성하고생성자에 Runnable 객체를넘겨주어 // 해당스레드에서 m_run_code 에정의된 run 메소드를수행할수있도록한다. Thread my_thread = new Thread(m_run_code);

2.2 Thread 객체생성자에 Runnable 인터페이스를직접생성하기 Runnable 인터페이스를따로선언해두지않고, Thread 객체를생성할때 new 키워드를이용하여생성하고, run 메소드를바로정의하는방법입니다. // Thread 객체를생성하고 run 메소드를정의한 Runnable 객체를생성하여생성자로 // 넘겨주어해당스레드에서 run 메소드를수행할수있도록한다. Thread my_thread = new Thread(new Runnable() ); 2.3 Thread 클래스에정의된 run 메소드재정의하기 Thread 클래스도 Runnable 인터페이스를포함하고있기때문에 Thread 클래스의 run 메소드를직접재정의할수있습니다. Thread 객체를생성하고이어서바로 run 메소드를재정의합니다. // Thread 객체를생성하면서, Thread 클래스내의 run 메소드를재정의한다. Thread my_thread = new Thread() ; 2.4 메인클래스에 Runnable 인터페이스를추가하여 run 메소드정의하기

Thread 객체를생성할클래스에 implements 키워드로 Runnable 인터페이스를추가하여 run 메소드를해당클래스에서재정의합니다. // 이클래스에서 Runnable 인터페이스의 run 메소드를재정의할수있도록한다. implements Runnable // Thread 를생성하고, 생성자에이클래스를넘겨준다. // 이클래스에는 Runnable 인터페이스가포함되어있어서 Thread 생성자내부에는 // 아래의 run 메소드가정의된 Runnable 인터페이스로받게된다. Thread my_thread = new Thread(this); // my_thread 스레드가수행하게되는 run 메소드 위와같은여러가지방법으로추가된스레드는 Thread 클래스의 start 메소드를이용하여 run 메소드에정의된루틴들을실행하도록할수있습니다. Thread my_thread = new Thread(...); my_thread.start(); 3. 생성된스레드에서 UI 관련작업하기 앞에서설명했듯이응용프로그램에서 UI 에관련된작업은메인스레드가처리합니다. 메인스레드가아닌추가된스레드에서 UI 에관련된작업을직접수행하는것은메인스레드와의충돌위험성등이존재하여안전하지않기때문에다른스레드에서해당작업을수행하고자할때에는메인스레드에서대신처리할수있도록처리작업을넘겨주기도합니다. 추가된스레드에서메인스레드로작업을넘기는방법은 View 클래스의 post 메소드를사용하는방법과 Handler 클래스의 post 메소드를사용하는방법이있으며이번강좌에서는 View 클래스의 post 메소드를사용하는방법만언급하도록하겠습니다. 다른스레드에서메인스레드로작업을넘기는것은스레드가수행할루틴을 Runnable 인터페이스의 run 메소드에정의하여 Thread 객체에넘기는것과동일하게생각하시면됩니다. 즉, post 메소드도인자로 Runnable 객체를받아서해당객체에정의된 run 메소드를메인스레드가수행하도록하기때문입니다. 그렇기때문에 2.1 이나 2.2 와동일한방법으로메인스레드가처리했으면하는작업들을 run 메소드에구성하면되고, post 메소드는대부분컨트롤의상위클래스인 View 클래스의메소드이므로컨트롤객체를얻어서객체명.post(Runnable 객체 ) 로호출하면됩니다.

예를들어, 네트워크프로그램을만든다고가정하면데이터를수신하는부분이긴시간을요구하는작업이될수있기때문에메인스레드가응답없음상태가될수있습니다. 이러한문제를해결하기위해서스레드를추가하여데이터를수신하는부분을해당스레드가수행하도록하면됩니다. 하지만수신된데이터를텍스트뷰와같은컨트롤에출력하고싶다면데이터를수신한스레드가메인스레드가아니기때문에직접 UI 함수를사용하면충돌하여문제가발생합니다. 이런경우아래와같이 post 메소드를사용하여메인스레드로작업수행을요청해서해결할수있습니다. ( 아래의코드는추가된스레드의 run 메소드에서메인스레드가처리해야할코드를 VIew 의하위클래스인 TextView 객체를이용해서전달하는예제입니다. ) implements Runnable Thread my_thread = new Thread(this); my_thread.start(); // 메인스레드에서수행하고자하는루틴을 run 메소드에정의하여 Runnable 객체를선언한다. Runnable main_run = new Runnable() // 메인스레드가처리해야할루틴... ; // TextView 클래스는 View 클래스의하위클래스이므로 post 메소드가지고있다 TextView tv = (TextView) findviewbyid(r.id.id_tv); // 메인스레드에게 main_run 객체의 run 메소드에정의된루틴을수행하도록전달한다. tv.post(main_run);