SlideShare a Scribd company logo
1 of 47
Download to read offline
Android Thread.
taesoo.kim87@gmail.com 김태수
Part1. Basic
1) 기본 방식(쓰레드생성, @Override run() )
class SimpleThread extends Thread {
public SimpleThread(String str) {super(str); }
public void run() { for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {sleep((int)(Math.random() * 1000)); }
catch (InterruptedException e) {}}
System.out.println("DONE! " + getName()); }}
기본 쓰레드 사용방법은 자바와 같습니다. 쓰레드 객체를 생성 후, run()메소드를 오버라이드
해서 작업을 지정하고, start()메소드로 쓰레드를 시작합니다.
출처: http://www.cs.nccu.edu.tw/~linw/javadoc/tutorial/java/threads/simple.html
class TwoThreadsTest {
public static void main (String args[]) {
new SimpleThread("Jamaica").start();
new SimpleThread("Fiji").start(); }}
1 개요
1 개요
2)Runnable
new Runnable(){
public void run(){
Toast.makeText(this.getApplicationContest(), "foo",
Toast.Length_SHORT).show();
}
}.run();
쓰레드를 구현하는 방법은 Thread클래스를 상속받는 방법과 Runnable인터페이스를 구현
하는 방법 2가지가 있는데, Thread클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문
에, Runnable인터페이스를 구현하는 방법이 일반적입니다.
Runnable인터페이스를 구현하는 방법은 재사용성(reusability)이 높고 코드의 일관성
(consistency)을 유지할 수 있다는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있
겠습니다.
출처 : http://www.slideshare.net/speedpointer/android-thread-14?related=5
1 개요
3)Thread
new Thread( new Runnable(){
public void run(){
Toast.makeText(this.getApplicationContest(), "foo",
Toast.Length_SHORT).show();
} }).start();
위와 같이 작성되었다면, 쓰레드는 안드로이드 UI제어가 불가하기 때문에 에러가 발생합니다.
new Thread(new Runnable() { public void run(){
Log.e("test","foo");
}
}
).start();
4) runOnUiThread
this.runOnUiThread(new Runnable(){
public void run(){
Toast.makeText(
getApplicationContext(),"foo",Toast.LENGTH_SHORT).show();
}
}
);
Runnable과 runOnUiThread는 안드로이드 UI제어가 가능합니다.
1 개요
5) 예시
new Runnable(){
public void run(){
Toast.makeText(getApplicationContext(), "foo",
Toast.LENGTH_SHORT).show();
}
}.run();
this.runOnUiThread(
new Runnable(){
public void run(){
Toast.makeText(getApplicationContext(), "cee", Toast.LENGTH_SHORT).show();
}
}
);
1 개요
5) 예시(계속)
new Runnable(){
public void run(){
Toast.makeText(getApplicationContext(), "roo", Toast.LENGTH_SHORT).show();
}
}.run();
Runnable과 runOnUiThread는 UI 제어를 쓰레드로 하기 좋습니다.
1 개요
6) Handler
new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
@Override
public void run(){
Toast.makeText(getApplicationContext(), "foo", Toast.LENGTH_SHORT).show();
}
}, 0);
안드로이드에서는 메인스레드와 서브스레드 간의 통신을 위해 Handler를 사용하게 되는데
Handler는 메시지큐를 사용한 메시지 전달 방법을 사용하게 됩니다. Handler에 Message가
들어오면 순서대로 쌓여서 FIFO(First in First Out) 형태로 메시지를 처리하게 됩니다. 가장
처음 들어온 Message를 우선 처리하게 됩니다.
1 개요
7) Asynctask
Easy to use : new myAsynctask().execute(A, B, C);
Private class myAsynctask extends AsyncTask<Object, Integer, Boolean> {
protected void onProgressUpdate(Integer… params) {
xxxx.setProgress(params[0]; }
protected Boolean doInBackground(Object… parmas) {
… …A->parmas[0], B- >params[1], C->parmas[3]
All different type can be casted Object …
}
protected void onPostExecute(final Boolean isFail) {
…
}
AsyncTask 내부에는 자체 ThreadPool 이 있어 Thread 가 무한정 늘어나 메모리에 부담을
주지 않도록 관리 하고 있기 때문에 따로 ThreadPool 을 관리하지 않는다면 AsyncTask 를 사
용하는것이 안정적입니다.
1 개요
7) Asynctask(계속)
AsyncTask’s parameter < 1, 2, 3 >
1 = type of A, B, C
2= onProgressUpdate’s param ?
3=onPostExecute’s param
1 개요
8) ThreadPoolExecutor
public boolean myThreadPool(Runnable r) {
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
4, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()
);
try {
threadPool.execute(r);
}
catch(Exception e) {
e.printStackTrace();
return false;
}
return true;
}
1 개요
8) ThreadPoolExecutor
사용법은 다음과 같습니다.
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, , BlockingQueue <Runnable > workQueue)
- corePoolSize : 실행할 최소 Thread수.
- maximumPoolSize : 최대 Thread 지원수
- keepAliveTime : 현재 풀에 corePoolSize 의 수보다 많은 thread가 있는 경우, 초과한 만
큼의 thread는, IDLE 상태가 되어 있는 기간이 keepAliveTime 를 넘으면(자동) 종료합니다
- unit : 시간단위.
- workQueue : 처리 큐.
( Java Doc 참조 :
http://xrath.com/javase/ko/6/docs/ko/api/java/util/concurrent/ThreadPoolExec
utor.html )
1 개요
8) ThreadPoolExecutor(계속)
BlockingQueue 에 적용가능한 Queue는 다음과 같습니다.
SynchronousQueue
- 워크 큐에 적절한 디폴트의 선택사항은, 태스크를 보관 유지하지 않고 thread에 핸드 오프.
- 일반적으로 직접 핸드 오프에서는, 송신된 새로운 태스크가 거부되는 것을 회피하기 위해서,
안 바운드 형식의 maximumPoolSizes 가 필요합니다.
- 이것에 의해, 평균해 처리 능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드
형식의 thread가 커질 가능성이 있습니다.
LinkedBlockingQueue
- corePoolSize 의 모든 thread가 Busy 상태인 경우에, 새로운 태스크는 큐내에서 대기합니
다. 이것에 의해, corePoolSize 를 넘는 thread는 작성되지 않게 됩니다. 즉
maximumPoolSize 의 값은 효과가 없어집니다. (maximumPoolSize 값은 의미 없음)
- 각 태스크가 완전하게 독립하고 있기 (위해)때문에, 태스크가 상호의 실행에 영향을 주지 않
는 경우는 이 방식이 적절하다라고 하는 것이 있습니다 (Web 페이지 서버의 경우 등).
- 이 방식의 큐잉은, 일시적으로 급증한 요구를 처리하는 경우 등은 편리합니다만, 평균해 처리
능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드 형식의 워크 큐가 커질 가능
성이 있습니다.
1 개요
8) ThreadPoolExecutor(계속)
ArrayBlockingQueue
- 한정된 maximumPoolSizes 로 사용하면(자) 자원 부족을 회피할 수 있습니다만, 조정과 제
어가 어려워질 가능성이 있습니다. 큐 사이즈와 최대 풀 사이즈는 서로 트레이드 오프의 관계가
되는 일이 있습니다.
1 개요
Part2. Exception
1) 상기
new Thread(new Runnable() {
public void run() { } }).start();
아무것도 하지 않으려면 이 최소코드가 있습니다.
new Thread() { }.start();
2 예외
2) 정리
- Thread, Runnable,Handler,AsynkTask, runOnUiThread,ThreadPoolExcutor
키워드만 사용합니다.
-AsynkTesk는 UI제어를 안드로이드에서 사용하기에 최고이고,
짧은 운영에 사용하기 더할 나위 없습니다.
-Handler & runOnUiThread는 안드로이드 UI를 제어하기에 간단하고 좋습니다.
-연산이나 어떤 다른 UI제어가 아닌 것을 위해서는 Runnable이나 thread, 이 둘이
섞인 메소드를 사용합니다.
- 만약 너무 많은 운영을 사용해야 한다면, ThreadPoolExcutor나 Queue를 사용합니다.
2 예외
3) Lock(계속)
onCreate()내에서 아래와 같이 사용
lamFine t1 = new lamFine("first");
lamFine t2 = new lamFine("second");
try { t1.start(); t2.start(); }
catch(Exception e) { //No way! }
만약 락을 제거하고싶다면, 같은 번호의 LogCat에서 간혹 sleep되는 코드들을 보세요.
2 예외
4) Lock(계속)
유사한 표현이 있습니다.
synchronized(java.lang.Object.class) {
a++; Log.e("HJH", "s Current Count = " +a);
}
하지만 sleep() second가 없으면 실행할 수 없습니다.
java.lang.Object.class 는 오직 하나이기 때문입니다.
추가로 휘발성 키워드입을 기억하세요.
private static volatile int = 0; 가 더 낫습니다.
2 예외
4) AsyncTask로 UI제어
class MyCallable implement Callable{
public Object call() throws Exception{
for(;;){ Log.e("HJH", "FUTURE TASK");
try{ Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace(); } } }}
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hajunho);
final futureTask fTask;
fTask = new FutureTask(new MyCallable());
ExecutorService excutor = Executors.newFixedThreadPool(1);
excutor.submit(fTask);
excutor.shutdown();
2 예외
5) RejectedExecutionException
1. 종료 후를 확인.
Executor.shutdown();
Executor.execute(myTask);
2. queue사이즈를 넘어 쓰레드를 생성하는 것을 시도.
ArrayBlockingQueue를 LinkedBlockingQueue으로 바꾸는 것은
rejectedExcutionException 회피입니다.
하지만 다른 문제가 일어나는 것은 알 수 없습니다.
2 예외
6) ScheduledThreadPoolExecutor
Timer에서 sleep과 유사합니다.
final ScheduledThreadPoolExecutor executor = new
ScheduledThreadPoolExecutor(1);
executor.scheduleAtFixedRate(new Runnable() {
int i = 0; public void run() {
try {
Log.e("HJH", "scheduledThreadPoolExecutor" + i++);
}
catch (Exception e) {
e.printStackTrace(); executor.shutdown();
}
}
},0,3,TimeUnit.SECONDS);
3초마다 로그가 찍힙니다.
2 예외
Part3. Atomic & Sync
1) 정리
-Runnable, Callable (반환값은 exist 또는 not exist)
-Executor 는 thread pool을 위해 존재.
(없으면 무한의 쓰레드생성으로 OutOfMemory에러)
- ScheduledThreadPoolExecutor 는 “sleep & notify” 과 같습니다.
-Future는 Callable이 끝낼까지 대기하도록 만들어졌습니다.
3 Atomic & Sync
2) RunnableFuture & Atomic
RunnableFuture는 java 1.6과 Android API level 9부터 지원합니다.
Public interface RunnableFuture<V> extends Runnable, Future<V>
FutureTask를 구현해서 task.isCancelled와 task.isDone를 제어할 수 있습니다.
ThreadPoolExecutor 에는 newTaskFor 라는 메소드가 있고, newTaskFor 로 해당 작업을
나타내는 RunnableFuture 객체를 반환시킵니다.
Atomic은 Jdk 5 과 Android API level 1 지원 합니다.
Java.util.concurrent.atomic
long value; -> AtomicLong value;
methods : addAndGet(), getAndSet(), incrementAndGet(), getAndDecrement()
예시)AtomicInteger i = 1;
getAndIncrement()의 반환값은 1
incrementAndGet의 반환값은 2
메소드 호출후 양쪽 i는 2.
3 Atomic & Sync
3) Synchronized, volatile
synchronized는 set(),get(),getAndSet()과 같은 AtomicLong메소드와 함께
삭제될겁니다.
Private int memberValue;
Public synchronized void setValue(int i) {
This.memberValue = I;
}
이렇게 바뀔 수 있습니다.
AtomicInteger I;
public void setValue(int i) {
This.memberValue = I;
}
자바에서는 스레드를 동기화 하기 위해서 synchronized를 제공하며, 스레드는
synchronized 메소드에 들어가기 위해 lock을 얻고 메소드가 끝이나면 lock을 반환한다. 어떠
한 스레드가 lock을 얻어 synchronized 메소드를 사용중이면 다른 메소드는 lock이 없으므로
synchronized에 접근할 수 없고, 다른 스레드가 lock을 반환 할 때까지 기다려야 합니다.
메소드 앞에 synchronized 키워드를 붙여서, 간단하게 사용할 수 있습니다.
3 Atomic & Sync
5) ThreadLocal
Public class MyDataStorage {
Public static ThreadLocal<String> myString = new ThreadLocal<String>();
}
MyString.set(x), get(), remove()
같은 변수를 통해, Thread마다 다른 값은 저장하기 위해 쓰입니다.
ThreadLocal.set() 을 통해 object를 넘겨주면, ThreadLocal은 HashTable에
currentThread와 넘겨받은 object를 저장합니다.
나중에 ThreadLocal.get()을 통해 메소드를 호출한 thread에 해당하는 값을 되찾아 올 수 있
습니다.
3 Atomic & Sync
Part4. Some of JAVA
1) 안드로이드의 기반인, 자바의 경우를 잠시 보려고 합니다.
4 Some Of Java
기초가 탄탄해야 한다고 하네요!
프로세스와 쓰레드 in Java
4 Some Of JAVA
간단한 정리 형식으로 이제부터 도표 형식으로 보입니다.
프로세스 실행중인 프로그램,자원,스레드로 구성
쓰레드
프로세스 내에서 실제 작업 수행. 모든 프로세스는 하나 이상의
쓰레드를 가지고 있음.
싱글쓰레드 프로세스: 자원+쓰레드, 하나의 쓰레드가 2개이상 작업처리
멀티쓰레드 프로세스=자원+n개의 쓰레드, 쓰레드와 작업이 1:1
- 단순히 CPU만 사용하는 연산작읍은 작업전환에 시간이 걸리지 않는
싱글쓰레드가 효율적.
- CPU이외의 자원을 사용하는 작업의 경우 멀티쓰레드 프로세스가 더 효율적
멀티쓰레딩
하나의 프로세스내에서 여러 쓰레드가 동시작업.
CPU사용율 향상
효율적 자원사용
사용자 응답성 향상
작업분리
동기화/교착상태 이슈
각 쓰레드가 균등한 부하를 갖도록 지향해야 함.
4 Some Of JAVA
멀티쓰레딩
하나의 프로세스내에서 여러 쓰레드가 동시작업.
CPU사용율 향상
효율적 자원사용
사용자 응답성 향상
작업분리
동기화/교착상태 이슈
각 쓰레드가 균등한 부하를 갖도록 지향해야 함.
쓰레드 그룹
서로 관련된 쓰레드를 그룹으로 묶어서 제어.
쓰레드 그룹에 다른 쓰레드 그룹 포함 가능.
자신이 속한 쓰레드 그룹과 하위 쓰레드 그룹은 변경가능. 그외 불가.
모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함.
쓰레드 그룹을 지정하지 않고 생성된 쓰레드는 메인쓰레드 그룹에포함
쓰레드를 쓰레드 그룹에 포함시키려면 thread 생성자 사용.
데몬 쓰레드
non-daemon 쓰레드(일반쓰레드)의 작업을 돕는 보조역할.
일반 쓰레드가 종료되면 자동 종료.
GC, 워드 프로세서의 자동저장, 자동 화면갱신등에 사용.
무한루프와 조건문으로 실행 후 대기하다가 특정 조건이 만족되면
작업수행하고 다시 대기하도록 작성됨.
boolean isDaemon():쓰레드가 데몬인지 확인.
void setDaemon(boolean on)스레드를 데몬쓰레드로 또는 사용자 쓰레드로 변경. 매개변수가
true이면 데몬쓰레드로 변경.
setDaemon()은 반드시 start()호출 전 실행되어야 함.
4 Some Of JAVA
쓰레드
생명주기
4 Some Of JAVA
상태 설명
NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED
동기화블럭에 의해서 일시정지된 상태
(LOCK이 풀릴 때 까지 기다리는 상태)
WAITING,
TIMED_
WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable)
일시 정지상태, TIMED_WAITING은 일시정지시간이 지정된 경우를 의미
TERMINATED 쓰레드의 작업이 종료된 상태
wait(), notify()
- 동기화의 효율을 높이기 위해 사용한다.
- Object 클래스의 정의되어 있으므로, 모든 객체에서 호출이 가능하다.
- 동기화 블록내에서만 사용할 수 있다.
- wait() : 객체의 lock을 풀고 해당 객체의 쓰레드를 대기상태로 둔다.
- notify() : 대기중인 쓰레드 중의 하나를 깨운다.
- notifyAll() : 대기중인 모든 쓰레드를 깨운다. 호출된 객체의 대기 중인
쓰레드만 해당 된다.
출처 http://gangzzang.tistory.com/m/post/75
멀티 쓰레드와 쓰레드 Issue in Java
4 Some Of JAVA
프로세스와 스레드
실행중인 애플리케이션을 Process라 부르고, 같은 애플리케이션을 여러 개 실행중일때 다중 프로세스라
한다.
멀티태스킹은 두가지 작업을 동시 처리함을 말하며, OS가 프로세스에 자원을 분할하면, 병렬실행한다.
스레드는 프로세스 내 멀티 태스킹으로 볼 수 있다.
메인스레드
자바프로그램은 메인스레드가 main()메소드를 실행하며 시작된다.메인스레드는 작업스레드를 만들어 병
렬로 코드를
실행할 수 있도록 멀티쓰레드를 생성해 멀티태스킹을 수행한다.
작업스레드
생성
(직접생성 vs
하위클래스생성)
java.lang.thread클래스를 객체화 해서 생성해도 되지만 Thread를 상속해서 하위 클래스를 만들어 생성할
수 있다.
Thread클래스로 부터 직접 생성
Thread thread = new Thread(Runnable target);
Runnable은 작업스레드가 실행할 수 있는 코드를 가지고 있는 객체이며, 인터페이스 타입이다.
그래서 구현 객체를 만들어 대입해야하고, run()메소드를 구현 클래스에서 재정의해서 작업스레드가 실행
할 코드를 작성해야 한다.
class Task implements Runnable{public void run(){ ; } } } //재정의
Thread thread =new Thread( new Runable() { public void run() { ; } } );//익명구현객체로 재정의
thread.start();//스레드 구동
Thread 하위 클래스로부터 생성
thread의 하위 클래스로 작업 스레드를 정의하는 동시에 작업내용을 포함시킴.
public class WorkerThread extends thread{ @Override
public void run(){ ; } //run()메소드 재정의
Thread thread = new WorkerThread();
thread.start();
4 Some Of JAVA
스레드 이름
Thread thread = Thread.currentThread(); thread.setName("쓰레드이름");
thread.getName();
스레드 우선순위
동시성(Concurrency)과
병럴성(Parallelism)
동시성 : 멀티 작업을 위해 하나의 코어에서 멀티스레드가 번갈아 가며 실행.
병렬성 : 멀티 코어에서 코어별 스레드를 동시에 실행.
싱글코어CPU의 멀티스레드 작업은 병렬적 실행으로 보이나, 동시성 작업이다.
스레드개수가 코어수보다 많으면, 어떤 순서에 의해 동시성으로 실행할 것인지 스레드 스
케쥴링을 통해 정한다.
스레드 스케쥴링
스레드 스케쥴링은 우선순위(priority)방식과 순환할당(Round-Robin)방식을 사용.
우선순위 방식은 우선순위가 높은 스레드가 실행상태를 더 많이 갖음.
순환할당 방식은 시간 할당량 방식(Time Slice)를 정해서 돌아가며 실행하는방식.
우선순위 방식은 스레드 객체에 우선순위를 개발자가 부여하여 조작.
순환할당 방식은 JVM에 의해 제어됨.
우선순위는 1이 높고 10이 낮음. 기본값은 5. 우선순위 부여는 thread.setPriority(우선순위
값);으로 제어.
thread.setPriority(Thread.MAX_PRIORITY);
thread.setPriority(Thread.NORM_PRIORITY);
thread.setPriority(Thread.MIN_PRIORITY);
4 Some Of JAVA
동기화 메소드와 동기화 블록
공유 객체 사용시 주의점
멀티스레드 프로그램에서는 스레드간 객체 공유를 하게 되므로, 사용 중 객체에는 락을 걸어서 사용할 수
없도록 해야함.
멀티스레드프로그램에서 단하나의 스레드만 실행할 수 있는 영역을 임계영역(크리티컬 섹션)이라한다.
자바는 임계영역을 지정하기 위해 동기화(synchronized) 메소드와 동기화 블록을 사용.
public synchronized void setMemory(int m){this.memory=m;}//동기화 메소드. 스레드가 이 메소드를 실
행하는 동안 잠김
public void setMemory(int m){synchronized(this)//this는 잠금대상
this.memory=m;}//동기화 블럭으로 동기화 메소드 구현
스레드 상태
스레드는 new에 의해 스레드 객체가 생성되고 run()에 의해 Running(실행)상태를 갖고, 스케쥴링에 의해
대기상태(Runnable)로 들어갔다가 실행을 반복하고, 종료(Terminated)된다.
일시정지상태는 WAITING, TIMED_WAITING, BLOCKED으로 구분되며, 이는 스레드를 실행할 수 없는 상태
라서 실행상태에서
실행대기 상태로 가지 않는다.
public StatePrintthread(Thread targetThread){//targetThread는 상태를 조사할 쓰레드)
this.targetthread=targetthread;
}
public void run(){while(true){Thread.State stare=targetthread.getState();//스레드 상태 획득
System.out.println("타겟 스레드 상태 : "+state);
if(state==Thread.State.NEW){//객체생성상태인경우 실행대기상태로 만듬.
targetthread.start();
}
if(state==thread.State.TERMINATED){break;}//종료상태인경우 반복문종료
스레드 상태 제어 실행중 스레드의 상태를 변경하는 것을 말함.
4 Some Of JAVA
스레드의 안전한 종료
stop플래그,interrupt()
stop플래스를 이용한 안전 종료
public class TheThread extends Thread{
private boolean stop;//stop플래스 필드
public void run(){
while(!stop){;}//stop이 true가 되면 run이 종료됨.
}}
interrupt()메소드를 이용하는 방법
try{Thread.sleep(1000);catch(InterruptedException e){}
thread.interrupt();//스레드를 종료시키기위해 InterruptedException발생시킴.
데몬(daemon)스레드
데몬스레드는 주스레드의 작업을 돕는 보조적 역할을 수행.
주 스레드가 종료되면 데몬스레드는 자동 종료됨
스레드 그룹
스레드 그룹은 스레드를 묶어서 관리할 목적으로 사용됨.
JVM이 실행되면 system스레드 그룹을 만들고, JVM운영에 필요한 스레드들을 생성해서 여기에 포함시킨다.
system의 하위 스레드 그룹으로 main을 만들고 메인스레드그룹에 포함시킨다. 스레드는 반드시 하나의 스레드 그
룹에
포함되며, 기본적으로 자신을 생성한 스레드와 같은 그룹에 속하게 된다.
스레드 이름 얻기
ThreadGroup group = Thread.currentThread.getThreadGroup();
String name=group.getName();
스레드 그룹 정보 얻기
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();//Map타입의 객체를 리턴하는 getAllStackT
races();
스레드 그룹 생성 ThreadGroup gtg=new ThreadGroup(String name);//또는 (ThreadGroup parent, String name);
스레드를 스레드그룹에 배정
Thread t = new thread(ThreadGroup group, Runnable target);
Thread t = new thread(ThreadGroup group, Runnable target, String name);
Thread t = new thread(ThreadGroup group, Runnable target, String name, long stackSize);
Thread t = new thread(ThreadGroup group, String name);
스레드그룹 일괄 interrupt()
그룹의 interrupt() 메소드를 한번만 호출함. 다만, 개별 스레드 예외처리는 하지 않아서 안전한 종료를 위해서는
개별 스레드마다 예외처리 해야한다.
4 Some Of JAVA
스레드 풀(출처 : 이것이 자바다 – 도서)
개요
병렬 처리 작업이 증가하면 스레드 수도 증가하고 CPU가 바빠져서 메모리 사용량이 늘어나고 애플리케이션 성능이
저하된다. 스레드 폭증을 막으려면 스레드 풀을 사용해야 한다.
스레드를 제한한 수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 처리한다. 최대 스레드 개수를 정해 놓아서
애플리케이션 성능이 급격히 저하되지 않는다.
생성
newCachedThreadPool() 메소드 : 초기 스레드 수=0, 코어 스레드 수=0, 최대 스레드 수=Integet MAX_VALUE
스레드 수보다 작업개수가 많으면 새 스레드를 생성시켜 작업 처리. 1개이상 스레드가 추가되면 60초동안 추가된 스레
드
가 아무 작업을 하지 않을때 추가된 스레드를 종료하고 풀에서 제거한다. 이론적으로는 int값이 가질 수 있는 최대값만
큼 스레드를 추가 할 수있으나, 운영체제 성능과 상황에 따라 달라진다.
ExecytorService executorService = Executors.newCachedThreadPool();
newFixedthreadPool(Int n)메소드 : 초기 스레드 수=0, 코어스레드수=n,최대 스레드수=n
최대 스레드 개수는 n이며, 스레드가 작업을 처리하지 않고 놀고 있더라도 스레드 개수를 줄이지 않는다.
ExecutorService executeorService = Executors.newFixedThreadPool(
Runtime.getRuntime().availableProcessors());
종료
void shutdown() - 현재 처리중인 작업뿐만 아니라 작업큐에 대기하고 있는 모든 작업을 처리한 후 스레드풀 종료
List<Runnable> shutdownNow() - 현재 작업 처리 중인 스레드를 interrupt해서 작업 중지를 시도하고 스레드 풀을 종
료,
작업큐에 있는 미처리된 작업(Runnable)목록을 반환.
boolean awaitTermination(long timeout, TimeUnit unit) - shutdown() 메소드 호출 이후 모든 작업 처리를 timeout시간
내에 완료하면 true반환, 그렇지 못하면 처리중인 스레드를 interrupt하고 false 를 반환
한다.
4 Some Of JAVA
작업 생성
작업은 Runnable 또는 Callable 구현 클래스로 표현된다.
Runnable task = new Runnable(){// 작업 처리 완료후 반환값이 없음.
@Override
public void run(){;}}
Callable<T> task = new Callable<T> {// 작업 처리 완료후 반환값이 있음.
@Override
public T call() throws Exception{;return T;}}
작업 처리 요청
ExecutorService의 작업큐에 Runnable 또는 Callable 객체를 넣는 행위를 말함.ExecutorService는 작업 처리 요청을 위해
다음 메소드를 제공한다.
void execute(Runnable cmd) - Runnable을 작업 큐에 저장 / 작업 처리 결과를 받지 못함.
Future<?> submit(Runnable task) - Runnable 또는 Callable을 작업 큐에 저장 / 반환된 Future를 통해 작업처리 결과획득
Future<V> submit(Runnable task, V result)
Future<V> submit(Callable<V> task)
submit은 작업처리 결과를 받을 수 있도록 Future를 제공하고, execute는 작업처리 결과를 받지 못한다.
블로킹 방식의 작업 완료
통보
Future객체는 작업 결과가 아니라 작업이 완료될때까지 기다렸다가(지연했다가=블로킹되었다가)최종 결과를 얻는데
사용된다. 그래서 Future를 지연완료(pending completion)객체라 한다.
V get() - 작업이 완료될때까지 블로킹 되었다가 처리결과 V를 반환
V get(long timeout, TimeUnit unit) - timeout 시간 전에 작업이 완료되지 않으면 Timeout예외 발생
반환타입 V는 submit(Runnable task, V result)의 두번째 타입인 V타입이거나, submit(Callable<V> task)의 Ballable타입 파라미
터 V타입이다.
submit은 작업도중 예외발생시 예외발생시킴.
submit(Runnable task) future.get() -> 작업 완료후 null반환
submit(Runnable task, Integer result) future.get() -> 작업 완료후 int값 반환
submit(Callable<String> task) future.get() -> 작업 완료후 String 값반환
boolean cancel(boolean mayInterruptIfRunning) - 작업 처리가 진행중일 경우 취소 시킴
boolean isCancelled() - 작업이 취소되었는지 여부 반환
boolean isDone() - 작업이 완료되었는지 여부 반환
4 Some Of JAVA
반환값이 없는 작업 완료 통보
반환값이 없는 작업은 Runnable객체로 생성한다.
Runnable task = new Runnable(){
@Override
public void run(){;}};
반환값이 없는 작업처리 요청은 submit메소드를 이용한다.
Future future = executorService.submit(task);
반환값이 있는 작업 통보
Callable<T> task = new Callable<T>{
@Override
public T call() throws Exception{; return T;}}};
Future<T> future = executorService.submit(task);
작업 처리 결과 외부객체에 저장
Result result= …;
Runnable task = new Task(result);
Future<Result> future = executorService.submit(task, result);
result = future.get();
작업 완료 순으로 통보
Future<V> poll() - 완료된 작업의Future를 반환. 완료된 작업이 없다면 즉시 null을 반환
Future<V> poll(long timeout, TimeUnit unit) - 완료된 작업의Future를 반환. 완료된 작업이 없다면 timeout까지 블로킹
됨
Future<V> task() - 완료된 작업의Future를 반환. 완료된 작업이 없다면 있을때 까지 블로킹됨
Future<V> submit(Callable<V> task) - 스레드풀에 Callable 작업 처리 요청
Future<V> submit(Runnable task, V result) - 스레드 풀에 Runnable 작업 처리 요청
콜백방식의 작업 완료 통보
Runnable task = new Runnable(){
@Override
public void run(){
try{
//작업처리
V result=..;
callback.complited(result, null);//작업을 정상 처리한 경우 호출
}catch(Exception e){callback.failed(e, null);}}};//예외가 발생하면 호출
Part5. CustomThreadPool
1) 다시 안드로이드로 돌아와서, 쓰레드.
스레드는 한번에 한가지 일만 하고, UI thread로 종료시 메시지를 주는 것이 좋습니다.
성능 좋은 작업 실행 프레임워크인 Executor인터페이스를 ExecutorService가 상속받고,
이를 다시 ThreadPoolExecutor에서 상속합니다.
쓰레드는 실행상태에서 shutdown()메소드가 호출되면 종료를 시작하고, 제거됩니다.
5 Thread Pool
2) 쓰레드풀
쓰레드풀은 Fixed, Cached, Single, CustomThreadPool로 구분됩니다.
각 쓰레드풀의 방식을 차례대로 나열하겠습니다.
Executors.newFixedthreadPool(n) //지정한 수만큼 쓰레드를 갖는 쓰레들 풀을 생성
Executors. newCachedThreadPool() // 재사용이 가능한 쓰레드 풀을 생성
Executors. newSingleThreadExecutor()//단일 쓰레드 사용하는 ExecutorService 생성
Executors. newScheduledThreadPool(int)//스케줄 가능한 쓰레드 풀을 생성
Executors. newSingleThreadScheduledExecutor()
//단일 쓰레드만을 사용하는 스케줄 가능한 ExecutorService 를 생성
new ThreadPoolExecutor(corePoolSize, maximumPoolSize, aliveTime, unit,
workQueue)//커스텀쓰레드 풀을 생성
5 Thread Pool
3) 도식화
다음 슬라이드에 그림을 한 장을 보이면서 마치겠습니다.
제가 만든 것은 아닙니다.
정리가 잘 된 것이 있어서 가져와봤습니다.
출처 : http://www.slideshare.net/andersgoransson/efficient-android-
threading?qid=e3547e63-db44-4260-aae8-
933367c75245&v=qf1&b=&from_search=1
5 Thread Pool
android_thread
android_thread

More Related Content

What's hot

[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현NAVER D2
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript Dahye Kim
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료beom kyun choi
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도ssuser3fb17c
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Yong Joon Moon
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern종빈 오
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)Kyoungchan Lee
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주iamhjoo (송형주)
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?내훈 정
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
스톰 미리보기
스톰 미리보기스톰 미리보기
스톰 미리보기June Yi
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 

What's hot (20)

[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료UML distilled 1장 스터디 발표 자료
UML distilled 1장 스터디 발표 자료
 
07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도07 스레드스케줄링,우선순위,그리고선호도
07 스레드스케줄링,우선순위,그리고선호도
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
Multithread design pattern
Multithread design patternMultithread design pattern
Multithread design pattern
 
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
GopherCon Korea 2015 - Python 개발자를 위한 Go (이경찬)
 
안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주안드로이드 멀티스레딩 입문 송형주
안드로이드 멀티스레딩 입문 송형주
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
스톰 미리보기
스톰 미리보기스톰 미리보기
스톰 미리보기
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 

Similar to android_thread

Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6Shin heemin
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기Seong Won Mun
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdfSeokju Hong
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10hyun soomyung
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본ssuser0c2478
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Naver api for android
Naver api for androidNaver api for android
Naver api for androidSangon Lee
 
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Presto User & Admin Guide
Presto User & Admin GuidePresto User & Admin Guide
Presto User & Admin GuideJEONGPHIL HAN
 

Similar to android_thread (20)

Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
Windows via c++ chapter6
Windows via c++   chapter6Windows via c++   chapter6
Windows via c++ chapter6
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기.NET에서 비동기 프로그래밍 배우기
.NET에서 비동기 프로그래밍 배우기
 
Rx java essentials
Rx java essentialsRx java essentials
Rx java essentials
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Clean code appendix 1
Clean code appendix 1Clean code appendix 1
Clean code appendix 1
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
JDK 변천사
JDK 변천사JDK 변천사
JDK 변천사
 
쓰레드.pdf
쓰레드.pdf쓰레드.pdf
쓰레드.pdf
 
Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10Design Pattern - Multithread Ch10
Design Pattern - Multithread Ch10
 
Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본Windows via C/C++ 06 스레드의 기본
Windows via C/C++ 06 스레드의 기본
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Naver api for android
Naver api for androidNaver api for android
Naver api for android
 
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
(C#,멀티쓰레드강좌)쓰레드, STA, MTA개요, 간단한 멀티쓰레드 예제_닷넷,C#,WPF,자마린실무강좌
 
Java(3/4)
Java(3/4)Java(3/4)
Java(3/4)
 
Presto User & Admin Guide
Presto User & Admin GuidePresto User & Admin Guide
Presto User & Admin Guide
 

android_thread

  • 3. 1) 기본 방식(쓰레드생성, @Override run() ) class SimpleThread extends Thread { public SimpleThread(String str) {super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try {sleep((int)(Math.random() * 1000)); } catch (InterruptedException e) {}} System.out.println("DONE! " + getName()); }} 기본 쓰레드 사용방법은 자바와 같습니다. 쓰레드 객체를 생성 후, run()메소드를 오버라이드 해서 작업을 지정하고, start()메소드로 쓰레드를 시작합니다. 출처: http://www.cs.nccu.edu.tw/~linw/javadoc/tutorial/java/threads/simple.html class TwoThreadsTest { public static void main (String args[]) { new SimpleThread("Jamaica").start(); new SimpleThread("Fiji").start(); }} 1 개요
  • 4. 1 개요 2)Runnable new Runnable(){ public void run(){ Toast.makeText(this.getApplicationContest(), "foo", Toast.Length_SHORT).show(); } }.run(); 쓰레드를 구현하는 방법은 Thread클래스를 상속받는 방법과 Runnable인터페이스를 구현 하는 방법 2가지가 있는데, Thread클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문 에, Runnable인터페이스를 구현하는 방법이 일반적입니다. Runnable인터페이스를 구현하는 방법은 재사용성(reusability)이 높고 코드의 일관성 (consistency)을 유지할 수 있다는 장점이 있기 때문에 보다 객체지향적인 방법이라 할 수 있 겠습니다. 출처 : http://www.slideshare.net/speedpointer/android-thread-14?related=5
  • 5. 1 개요 3)Thread new Thread( new Runnable(){ public void run(){ Toast.makeText(this.getApplicationContest(), "foo", Toast.Length_SHORT).show(); } }).start(); 위와 같이 작성되었다면, 쓰레드는 안드로이드 UI제어가 불가하기 때문에 에러가 발생합니다. new Thread(new Runnable() { public void run(){ Log.e("test","foo"); } } ).start();
  • 6. 4) runOnUiThread this.runOnUiThread(new Runnable(){ public void run(){ Toast.makeText( getApplicationContext(),"foo",Toast.LENGTH_SHORT).show(); } } ); Runnable과 runOnUiThread는 안드로이드 UI제어가 가능합니다. 1 개요
  • 7. 5) 예시 new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "foo", Toast.LENGTH_SHORT).show(); } }.run(); this.runOnUiThread( new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "cee", Toast.LENGTH_SHORT).show(); } } ); 1 개요
  • 8. 5) 예시(계속) new Runnable(){ public void run(){ Toast.makeText(getApplicationContext(), "roo", Toast.LENGTH_SHORT).show(); } }.run(); Runnable과 runOnUiThread는 UI 제어를 쓰레드로 하기 좋습니다. 1 개요
  • 9. 6) Handler new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){ @Override public void run(){ Toast.makeText(getApplicationContext(), "foo", Toast.LENGTH_SHORT).show(); } }, 0); 안드로이드에서는 메인스레드와 서브스레드 간의 통신을 위해 Handler를 사용하게 되는데 Handler는 메시지큐를 사용한 메시지 전달 방법을 사용하게 됩니다. Handler에 Message가 들어오면 순서대로 쌓여서 FIFO(First in First Out) 형태로 메시지를 처리하게 됩니다. 가장 처음 들어온 Message를 우선 처리하게 됩니다. 1 개요
  • 10. 7) Asynctask Easy to use : new myAsynctask().execute(A, B, C); Private class myAsynctask extends AsyncTask<Object, Integer, Boolean> { protected void onProgressUpdate(Integer… params) { xxxx.setProgress(params[0]; } protected Boolean doInBackground(Object… parmas) { … …A->parmas[0], B- >params[1], C->parmas[3] All different type can be casted Object … } protected void onPostExecute(final Boolean isFail) { … } AsyncTask 내부에는 자체 ThreadPool 이 있어 Thread 가 무한정 늘어나 메모리에 부담을 주지 않도록 관리 하고 있기 때문에 따로 ThreadPool 을 관리하지 않는다면 AsyncTask 를 사 용하는것이 안정적입니다. 1 개요
  • 11. 7) Asynctask(계속) AsyncTask’s parameter < 1, 2, 3 > 1 = type of A, B, C 2= onProgressUpdate’s param ? 3=onPostExecute’s param 1 개요
  • 12. 8) ThreadPoolExecutor public boolean myThreadPool(Runnable r) { ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 4, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>() ); try { threadPool.execute(r); } catch(Exception e) { e.printStackTrace(); return false; } return true; } 1 개요
  • 13. 8) ThreadPoolExecutor 사용법은 다음과 같습니다. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, , BlockingQueue <Runnable > workQueue) - corePoolSize : 실행할 최소 Thread수. - maximumPoolSize : 최대 Thread 지원수 - keepAliveTime : 현재 풀에 corePoolSize 의 수보다 많은 thread가 있는 경우, 초과한 만 큼의 thread는, IDLE 상태가 되어 있는 기간이 keepAliveTime 를 넘으면(자동) 종료합니다 - unit : 시간단위. - workQueue : 처리 큐. ( Java Doc 참조 : http://xrath.com/javase/ko/6/docs/ko/api/java/util/concurrent/ThreadPoolExec utor.html ) 1 개요
  • 14. 8) ThreadPoolExecutor(계속) BlockingQueue 에 적용가능한 Queue는 다음과 같습니다. SynchronousQueue - 워크 큐에 적절한 디폴트의 선택사항은, 태스크를 보관 유지하지 않고 thread에 핸드 오프. - 일반적으로 직접 핸드 오프에서는, 송신된 새로운 태스크가 거부되는 것을 회피하기 위해서, 안 바운드 형식의 maximumPoolSizes 가 필요합니다. - 이것에 의해, 평균해 처리 능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드 형식의 thread가 커질 가능성이 있습니다. LinkedBlockingQueue - corePoolSize 의 모든 thread가 Busy 상태인 경우에, 새로운 태스크는 큐내에서 대기합니 다. 이것에 의해, corePoolSize 를 넘는 thread는 작성되지 않게 됩니다. 즉 maximumPoolSize 의 값은 효과가 없어집니다. (maximumPoolSize 값은 의미 없음) - 각 태스크가 완전하게 독립하고 있기 (위해)때문에, 태스크가 상호의 실행에 영향을 주지 않 는 경우는 이 방식이 적절하다라고 하는 것이 있습니다 (Web 페이지 서버의 경우 등). - 이 방식의 큐잉은, 일시적으로 급증한 요구를 처리하는 경우 등은 편리합니다만, 평균해 처리 능력을 넘는 속도로 커멘드가 차례차례로 도착하면(자), 안 바운드 형식의 워크 큐가 커질 가능 성이 있습니다. 1 개요
  • 15. 8) ThreadPoolExecutor(계속) ArrayBlockingQueue - 한정된 maximumPoolSizes 로 사용하면(자) 자원 부족을 회피할 수 있습니다만, 조정과 제 어가 어려워질 가능성이 있습니다. 큐 사이즈와 최대 풀 사이즈는 서로 트레이드 오프의 관계가 되는 일이 있습니다. 1 개요
  • 17. 1) 상기 new Thread(new Runnable() { public void run() { } }).start(); 아무것도 하지 않으려면 이 최소코드가 있습니다. new Thread() { }.start(); 2 예외
  • 18. 2) 정리 - Thread, Runnable,Handler,AsynkTask, runOnUiThread,ThreadPoolExcutor 키워드만 사용합니다. -AsynkTesk는 UI제어를 안드로이드에서 사용하기에 최고이고, 짧은 운영에 사용하기 더할 나위 없습니다. -Handler & runOnUiThread는 안드로이드 UI를 제어하기에 간단하고 좋습니다. -연산이나 어떤 다른 UI제어가 아닌 것을 위해서는 Runnable이나 thread, 이 둘이 섞인 메소드를 사용합니다. - 만약 너무 많은 운영을 사용해야 한다면, ThreadPoolExcutor나 Queue를 사용합니다. 2 예외
  • 19. 3) Lock(계속) onCreate()내에서 아래와 같이 사용 lamFine t1 = new lamFine("first"); lamFine t2 = new lamFine("second"); try { t1.start(); t2.start(); } catch(Exception e) { //No way! } 만약 락을 제거하고싶다면, 같은 번호의 LogCat에서 간혹 sleep되는 코드들을 보세요. 2 예외
  • 20. 4) Lock(계속) 유사한 표현이 있습니다. synchronized(java.lang.Object.class) { a++; Log.e("HJH", "s Current Count = " +a); } 하지만 sleep() second가 없으면 실행할 수 없습니다. java.lang.Object.class 는 오직 하나이기 때문입니다. 추가로 휘발성 키워드입을 기억하세요. private static volatile int = 0; 가 더 낫습니다. 2 예외
  • 21. 4) AsyncTask로 UI제어 class MyCallable implement Callable{ public Object call() throws Exception{ for(;;){ Log.e("HJH", "FUTURE TASK"); try{ Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace(); } } }} @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_hajunho); final futureTask fTask; fTask = new FutureTask(new MyCallable()); ExecutorService excutor = Executors.newFixedThreadPool(1); excutor.submit(fTask); excutor.shutdown(); 2 예외
  • 22. 5) RejectedExecutionException 1. 종료 후를 확인. Executor.shutdown(); Executor.execute(myTask); 2. queue사이즈를 넘어 쓰레드를 생성하는 것을 시도. ArrayBlockingQueue를 LinkedBlockingQueue으로 바꾸는 것은 rejectedExcutionException 회피입니다. 하지만 다른 문제가 일어나는 것은 알 수 없습니다. 2 예외
  • 23. 6) ScheduledThreadPoolExecutor Timer에서 sleep과 유사합니다. final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); executor.scheduleAtFixedRate(new Runnable() { int i = 0; public void run() { try { Log.e("HJH", "scheduledThreadPoolExecutor" + i++); } catch (Exception e) { e.printStackTrace(); executor.shutdown(); } } },0,3,TimeUnit.SECONDS); 3초마다 로그가 찍힙니다. 2 예외
  • 25. 1) 정리 -Runnable, Callable (반환값은 exist 또는 not exist) -Executor 는 thread pool을 위해 존재. (없으면 무한의 쓰레드생성으로 OutOfMemory에러) - ScheduledThreadPoolExecutor 는 “sleep & notify” 과 같습니다. -Future는 Callable이 끝낼까지 대기하도록 만들어졌습니다. 3 Atomic & Sync
  • 26. 2) RunnableFuture & Atomic RunnableFuture는 java 1.6과 Android API level 9부터 지원합니다. Public interface RunnableFuture<V> extends Runnable, Future<V> FutureTask를 구현해서 task.isCancelled와 task.isDone를 제어할 수 있습니다. ThreadPoolExecutor 에는 newTaskFor 라는 메소드가 있고, newTaskFor 로 해당 작업을 나타내는 RunnableFuture 객체를 반환시킵니다. Atomic은 Jdk 5 과 Android API level 1 지원 합니다. Java.util.concurrent.atomic long value; -> AtomicLong value; methods : addAndGet(), getAndSet(), incrementAndGet(), getAndDecrement() 예시)AtomicInteger i = 1; getAndIncrement()의 반환값은 1 incrementAndGet의 반환값은 2 메소드 호출후 양쪽 i는 2. 3 Atomic & Sync
  • 27. 3) Synchronized, volatile synchronized는 set(),get(),getAndSet()과 같은 AtomicLong메소드와 함께 삭제될겁니다. Private int memberValue; Public synchronized void setValue(int i) { This.memberValue = I; } 이렇게 바뀔 수 있습니다. AtomicInteger I; public void setValue(int i) { This.memberValue = I; } 자바에서는 스레드를 동기화 하기 위해서 synchronized를 제공하며, 스레드는 synchronized 메소드에 들어가기 위해 lock을 얻고 메소드가 끝이나면 lock을 반환한다. 어떠 한 스레드가 lock을 얻어 synchronized 메소드를 사용중이면 다른 메소드는 lock이 없으므로 synchronized에 접근할 수 없고, 다른 스레드가 lock을 반환 할 때까지 기다려야 합니다. 메소드 앞에 synchronized 키워드를 붙여서, 간단하게 사용할 수 있습니다. 3 Atomic & Sync
  • 28. 5) ThreadLocal Public class MyDataStorage { Public static ThreadLocal<String> myString = new ThreadLocal<String>(); } MyString.set(x), get(), remove() 같은 변수를 통해, Thread마다 다른 값은 저장하기 위해 쓰입니다. ThreadLocal.set() 을 통해 object를 넘겨주면, ThreadLocal은 HashTable에 currentThread와 넘겨받은 object를 저장합니다. 나중에 ThreadLocal.get()을 통해 메소드를 호출한 thread에 해당하는 값을 되찾아 올 수 있 습니다. 3 Atomic & Sync
  • 30. 1) 안드로이드의 기반인, 자바의 경우를 잠시 보려고 합니다. 4 Some Of Java 기초가 탄탄해야 한다고 하네요!
  • 31. 프로세스와 쓰레드 in Java 4 Some Of JAVA 간단한 정리 형식으로 이제부터 도표 형식으로 보입니다. 프로세스 실행중인 프로그램,자원,스레드로 구성 쓰레드 프로세스 내에서 실제 작업 수행. 모든 프로세스는 하나 이상의 쓰레드를 가지고 있음. 싱글쓰레드 프로세스: 자원+쓰레드, 하나의 쓰레드가 2개이상 작업처리 멀티쓰레드 프로세스=자원+n개의 쓰레드, 쓰레드와 작업이 1:1 - 단순히 CPU만 사용하는 연산작읍은 작업전환에 시간이 걸리지 않는 싱글쓰레드가 효율적. - CPU이외의 자원을 사용하는 작업의 경우 멀티쓰레드 프로세스가 더 효율적 멀티쓰레딩 하나의 프로세스내에서 여러 쓰레드가 동시작업. CPU사용율 향상 효율적 자원사용 사용자 응답성 향상 작업분리 동기화/교착상태 이슈 각 쓰레드가 균등한 부하를 갖도록 지향해야 함.
  • 32. 4 Some Of JAVA 멀티쓰레딩 하나의 프로세스내에서 여러 쓰레드가 동시작업. CPU사용율 향상 효율적 자원사용 사용자 응답성 향상 작업분리 동기화/교착상태 이슈 각 쓰레드가 균등한 부하를 갖도록 지향해야 함. 쓰레드 그룹 서로 관련된 쓰레드를 그룹으로 묶어서 제어. 쓰레드 그룹에 다른 쓰레드 그룹 포함 가능. 자신이 속한 쓰레드 그룹과 하위 쓰레드 그룹은 변경가능. 그외 불가. 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함. 쓰레드 그룹을 지정하지 않고 생성된 쓰레드는 메인쓰레드 그룹에포함 쓰레드를 쓰레드 그룹에 포함시키려면 thread 생성자 사용. 데몬 쓰레드 non-daemon 쓰레드(일반쓰레드)의 작업을 돕는 보조역할. 일반 쓰레드가 종료되면 자동 종료. GC, 워드 프로세서의 자동저장, 자동 화면갱신등에 사용. 무한루프와 조건문으로 실행 후 대기하다가 특정 조건이 만족되면 작업수행하고 다시 대기하도록 작성됨. boolean isDaemon():쓰레드가 데몬인지 확인. void setDaemon(boolean on)스레드를 데몬쓰레드로 또는 사용자 쓰레드로 변경. 매개변수가 true이면 데몬쓰레드로 변경. setDaemon()은 반드시 start()호출 전 실행되어야 함.
  • 33. 4 Some Of JAVA 쓰레드 생명주기
  • 34. 4 Some Of JAVA 상태 설명 NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태 RUNNABLE 실행 중 또는 실행 가능한 상태 BLOCKED 동기화블럭에 의해서 일시정지된 상태 (LOCK이 풀릴 때 까지 기다리는 상태) WAITING, TIMED_ WAITING 쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시 정지상태, TIMED_WAITING은 일시정지시간이 지정된 경우를 의미 TERMINATED 쓰레드의 작업이 종료된 상태 wait(), notify() - 동기화의 효율을 높이기 위해 사용한다. - Object 클래스의 정의되어 있으므로, 모든 객체에서 호출이 가능하다. - 동기화 블록내에서만 사용할 수 있다. - wait() : 객체의 lock을 풀고 해당 객체의 쓰레드를 대기상태로 둔다. - notify() : 대기중인 쓰레드 중의 하나를 깨운다. - notifyAll() : 대기중인 모든 쓰레드를 깨운다. 호출된 객체의 대기 중인 쓰레드만 해당 된다. 출처 http://gangzzang.tistory.com/m/post/75
  • 35. 멀티 쓰레드와 쓰레드 Issue in Java 4 Some Of JAVA 프로세스와 스레드 실행중인 애플리케이션을 Process라 부르고, 같은 애플리케이션을 여러 개 실행중일때 다중 프로세스라 한다. 멀티태스킹은 두가지 작업을 동시 처리함을 말하며, OS가 프로세스에 자원을 분할하면, 병렬실행한다. 스레드는 프로세스 내 멀티 태스킹으로 볼 수 있다. 메인스레드 자바프로그램은 메인스레드가 main()메소드를 실행하며 시작된다.메인스레드는 작업스레드를 만들어 병 렬로 코드를 실행할 수 있도록 멀티쓰레드를 생성해 멀티태스킹을 수행한다. 작업스레드 생성 (직접생성 vs 하위클래스생성) java.lang.thread클래스를 객체화 해서 생성해도 되지만 Thread를 상속해서 하위 클래스를 만들어 생성할 수 있다. Thread클래스로 부터 직접 생성 Thread thread = new Thread(Runnable target); Runnable은 작업스레드가 실행할 수 있는 코드를 가지고 있는 객체이며, 인터페이스 타입이다. 그래서 구현 객체를 만들어 대입해야하고, run()메소드를 구현 클래스에서 재정의해서 작업스레드가 실행 할 코드를 작성해야 한다. class Task implements Runnable{public void run(){ ; } } } //재정의 Thread thread =new Thread( new Runable() { public void run() { ; } } );//익명구현객체로 재정의 thread.start();//스레드 구동 Thread 하위 클래스로부터 생성 thread의 하위 클래스로 작업 스레드를 정의하는 동시에 작업내용을 포함시킴. public class WorkerThread extends thread{ @Override public void run(){ ; } //run()메소드 재정의 Thread thread = new WorkerThread(); thread.start();
  • 36. 4 Some Of JAVA 스레드 이름 Thread thread = Thread.currentThread(); thread.setName("쓰레드이름"); thread.getName(); 스레드 우선순위 동시성(Concurrency)과 병럴성(Parallelism) 동시성 : 멀티 작업을 위해 하나의 코어에서 멀티스레드가 번갈아 가며 실행. 병렬성 : 멀티 코어에서 코어별 스레드를 동시에 실행. 싱글코어CPU의 멀티스레드 작업은 병렬적 실행으로 보이나, 동시성 작업이다. 스레드개수가 코어수보다 많으면, 어떤 순서에 의해 동시성으로 실행할 것인지 스레드 스 케쥴링을 통해 정한다. 스레드 스케쥴링 스레드 스케쥴링은 우선순위(priority)방식과 순환할당(Round-Robin)방식을 사용. 우선순위 방식은 우선순위가 높은 스레드가 실행상태를 더 많이 갖음. 순환할당 방식은 시간 할당량 방식(Time Slice)를 정해서 돌아가며 실행하는방식. 우선순위 방식은 스레드 객체에 우선순위를 개발자가 부여하여 조작. 순환할당 방식은 JVM에 의해 제어됨. 우선순위는 1이 높고 10이 낮음. 기본값은 5. 우선순위 부여는 thread.setPriority(우선순위 값);으로 제어. thread.setPriority(Thread.MAX_PRIORITY); thread.setPriority(Thread.NORM_PRIORITY); thread.setPriority(Thread.MIN_PRIORITY);
  • 37. 4 Some Of JAVA 동기화 메소드와 동기화 블록 공유 객체 사용시 주의점 멀티스레드 프로그램에서는 스레드간 객체 공유를 하게 되므로, 사용 중 객체에는 락을 걸어서 사용할 수 없도록 해야함. 멀티스레드프로그램에서 단하나의 스레드만 실행할 수 있는 영역을 임계영역(크리티컬 섹션)이라한다. 자바는 임계영역을 지정하기 위해 동기화(synchronized) 메소드와 동기화 블록을 사용. public synchronized void setMemory(int m){this.memory=m;}//동기화 메소드. 스레드가 이 메소드를 실 행하는 동안 잠김 public void setMemory(int m){synchronized(this)//this는 잠금대상 this.memory=m;}//동기화 블럭으로 동기화 메소드 구현 스레드 상태 스레드는 new에 의해 스레드 객체가 생성되고 run()에 의해 Running(실행)상태를 갖고, 스케쥴링에 의해 대기상태(Runnable)로 들어갔다가 실행을 반복하고, 종료(Terminated)된다. 일시정지상태는 WAITING, TIMED_WAITING, BLOCKED으로 구분되며, 이는 스레드를 실행할 수 없는 상태 라서 실행상태에서 실행대기 상태로 가지 않는다. public StatePrintthread(Thread targetThread){//targetThread는 상태를 조사할 쓰레드) this.targetthread=targetthread; } public void run(){while(true){Thread.State stare=targetthread.getState();//스레드 상태 획득 System.out.println("타겟 스레드 상태 : "+state); if(state==Thread.State.NEW){//객체생성상태인경우 실행대기상태로 만듬. targetthread.start(); } if(state==thread.State.TERMINATED){break;}//종료상태인경우 반복문종료 스레드 상태 제어 실행중 스레드의 상태를 변경하는 것을 말함.
  • 38. 4 Some Of JAVA 스레드의 안전한 종료 stop플래그,interrupt() stop플래스를 이용한 안전 종료 public class TheThread extends Thread{ private boolean stop;//stop플래스 필드 public void run(){ while(!stop){;}//stop이 true가 되면 run이 종료됨. }} interrupt()메소드를 이용하는 방법 try{Thread.sleep(1000);catch(InterruptedException e){} thread.interrupt();//스레드를 종료시키기위해 InterruptedException발생시킴. 데몬(daemon)스레드 데몬스레드는 주스레드의 작업을 돕는 보조적 역할을 수행. 주 스레드가 종료되면 데몬스레드는 자동 종료됨 스레드 그룹 스레드 그룹은 스레드를 묶어서 관리할 목적으로 사용됨. JVM이 실행되면 system스레드 그룹을 만들고, JVM운영에 필요한 스레드들을 생성해서 여기에 포함시킨다. system의 하위 스레드 그룹으로 main을 만들고 메인스레드그룹에 포함시킨다. 스레드는 반드시 하나의 스레드 그 룹에 포함되며, 기본적으로 자신을 생성한 스레드와 같은 그룹에 속하게 된다. 스레드 이름 얻기 ThreadGroup group = Thread.currentThread.getThreadGroup(); String name=group.getName(); 스레드 그룹 정보 얻기 Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();//Map타입의 객체를 리턴하는 getAllStackT races(); 스레드 그룹 생성 ThreadGroup gtg=new ThreadGroup(String name);//또는 (ThreadGroup parent, String name); 스레드를 스레드그룹에 배정 Thread t = new thread(ThreadGroup group, Runnable target); Thread t = new thread(ThreadGroup group, Runnable target, String name); Thread t = new thread(ThreadGroup group, Runnable target, String name, long stackSize); Thread t = new thread(ThreadGroup group, String name); 스레드그룹 일괄 interrupt() 그룹의 interrupt() 메소드를 한번만 호출함. 다만, 개별 스레드 예외처리는 하지 않아서 안전한 종료를 위해서는 개별 스레드마다 예외처리 해야한다.
  • 39. 4 Some Of JAVA 스레드 풀(출처 : 이것이 자바다 – 도서) 개요 병렬 처리 작업이 증가하면 스레드 수도 증가하고 CPU가 바빠져서 메모리 사용량이 늘어나고 애플리케이션 성능이 저하된다. 스레드 폭증을 막으려면 스레드 풀을 사용해야 한다. 스레드를 제한한 수만큼 정해놓고 작업큐에 들어오는 작업들을 하나씩 처리한다. 최대 스레드 개수를 정해 놓아서 애플리케이션 성능이 급격히 저하되지 않는다. 생성 newCachedThreadPool() 메소드 : 초기 스레드 수=0, 코어 스레드 수=0, 최대 스레드 수=Integet MAX_VALUE 스레드 수보다 작업개수가 많으면 새 스레드를 생성시켜 작업 처리. 1개이상 스레드가 추가되면 60초동안 추가된 스레 드 가 아무 작업을 하지 않을때 추가된 스레드를 종료하고 풀에서 제거한다. 이론적으로는 int값이 가질 수 있는 최대값만 큼 스레드를 추가 할 수있으나, 운영체제 성능과 상황에 따라 달라진다. ExecytorService executorService = Executors.newCachedThreadPool(); newFixedthreadPool(Int n)메소드 : 초기 스레드 수=0, 코어스레드수=n,최대 스레드수=n 최대 스레드 개수는 n이며, 스레드가 작업을 처리하지 않고 놀고 있더라도 스레드 개수를 줄이지 않는다. ExecutorService executeorService = Executors.newFixedThreadPool( Runtime.getRuntime().availableProcessors()); 종료 void shutdown() - 현재 처리중인 작업뿐만 아니라 작업큐에 대기하고 있는 모든 작업을 처리한 후 스레드풀 종료 List<Runnable> shutdownNow() - 현재 작업 처리 중인 스레드를 interrupt해서 작업 중지를 시도하고 스레드 풀을 종 료, 작업큐에 있는 미처리된 작업(Runnable)목록을 반환. boolean awaitTermination(long timeout, TimeUnit unit) - shutdown() 메소드 호출 이후 모든 작업 처리를 timeout시간 내에 완료하면 true반환, 그렇지 못하면 처리중인 스레드를 interrupt하고 false 를 반환 한다.
  • 40. 4 Some Of JAVA 작업 생성 작업은 Runnable 또는 Callable 구현 클래스로 표현된다. Runnable task = new Runnable(){// 작업 처리 완료후 반환값이 없음. @Override public void run(){;}} Callable<T> task = new Callable<T> {// 작업 처리 완료후 반환값이 있음. @Override public T call() throws Exception{;return T;}} 작업 처리 요청 ExecutorService의 작업큐에 Runnable 또는 Callable 객체를 넣는 행위를 말함.ExecutorService는 작업 처리 요청을 위해 다음 메소드를 제공한다. void execute(Runnable cmd) - Runnable을 작업 큐에 저장 / 작업 처리 결과를 받지 못함. Future<?> submit(Runnable task) - Runnable 또는 Callable을 작업 큐에 저장 / 반환된 Future를 통해 작업처리 결과획득 Future<V> submit(Runnable task, V result) Future<V> submit(Callable<V> task) submit은 작업처리 결과를 받을 수 있도록 Future를 제공하고, execute는 작업처리 결과를 받지 못한다. 블로킹 방식의 작업 완료 통보 Future객체는 작업 결과가 아니라 작업이 완료될때까지 기다렸다가(지연했다가=블로킹되었다가)최종 결과를 얻는데 사용된다. 그래서 Future를 지연완료(pending completion)객체라 한다. V get() - 작업이 완료될때까지 블로킹 되었다가 처리결과 V를 반환 V get(long timeout, TimeUnit unit) - timeout 시간 전에 작업이 완료되지 않으면 Timeout예외 발생 반환타입 V는 submit(Runnable task, V result)의 두번째 타입인 V타입이거나, submit(Callable<V> task)의 Ballable타입 파라미 터 V타입이다. submit은 작업도중 예외발생시 예외발생시킴. submit(Runnable task) future.get() -> 작업 완료후 null반환 submit(Runnable task, Integer result) future.get() -> 작업 완료후 int값 반환 submit(Callable<String> task) future.get() -> 작업 완료후 String 값반환 boolean cancel(boolean mayInterruptIfRunning) - 작업 처리가 진행중일 경우 취소 시킴 boolean isCancelled() - 작업이 취소되었는지 여부 반환 boolean isDone() - 작업이 완료되었는지 여부 반환
  • 41. 4 Some Of JAVA 반환값이 없는 작업 완료 통보 반환값이 없는 작업은 Runnable객체로 생성한다. Runnable task = new Runnable(){ @Override public void run(){;}}; 반환값이 없는 작업처리 요청은 submit메소드를 이용한다. Future future = executorService.submit(task); 반환값이 있는 작업 통보 Callable<T> task = new Callable<T>{ @Override public T call() throws Exception{; return T;}}}; Future<T> future = executorService.submit(task); 작업 처리 결과 외부객체에 저장 Result result= …; Runnable task = new Task(result); Future<Result> future = executorService.submit(task, result); result = future.get(); 작업 완료 순으로 통보 Future<V> poll() - 완료된 작업의Future를 반환. 완료된 작업이 없다면 즉시 null을 반환 Future<V> poll(long timeout, TimeUnit unit) - 완료된 작업의Future를 반환. 완료된 작업이 없다면 timeout까지 블로킹 됨 Future<V> task() - 완료된 작업의Future를 반환. 완료된 작업이 없다면 있을때 까지 블로킹됨 Future<V> submit(Callable<V> task) - 스레드풀에 Callable 작업 처리 요청 Future<V> submit(Runnable task, V result) - 스레드 풀에 Runnable 작업 처리 요청 콜백방식의 작업 완료 통보 Runnable task = new Runnable(){ @Override public void run(){ try{ //작업처리 V result=..; callback.complited(result, null);//작업을 정상 처리한 경우 호출 }catch(Exception e){callback.failed(e, null);}}};//예외가 발생하면 호출
  • 43. 1) 다시 안드로이드로 돌아와서, 쓰레드. 스레드는 한번에 한가지 일만 하고, UI thread로 종료시 메시지를 주는 것이 좋습니다. 성능 좋은 작업 실행 프레임워크인 Executor인터페이스를 ExecutorService가 상속받고, 이를 다시 ThreadPoolExecutor에서 상속합니다. 쓰레드는 실행상태에서 shutdown()메소드가 호출되면 종료를 시작하고, 제거됩니다. 5 Thread Pool
  • 44. 2) 쓰레드풀 쓰레드풀은 Fixed, Cached, Single, CustomThreadPool로 구분됩니다. 각 쓰레드풀의 방식을 차례대로 나열하겠습니다. Executors.newFixedthreadPool(n) //지정한 수만큼 쓰레드를 갖는 쓰레들 풀을 생성 Executors. newCachedThreadPool() // 재사용이 가능한 쓰레드 풀을 생성 Executors. newSingleThreadExecutor()//단일 쓰레드 사용하는 ExecutorService 생성 Executors. newScheduledThreadPool(int)//스케줄 가능한 쓰레드 풀을 생성 Executors. newSingleThreadScheduledExecutor() //단일 쓰레드만을 사용하는 스케줄 가능한 ExecutorService 를 생성 new ThreadPoolExecutor(corePoolSize, maximumPoolSize, aliveTime, unit, workQueue)//커스텀쓰레드 풀을 생성 5 Thread Pool
  • 45. 3) 도식화 다음 슬라이드에 그림을 한 장을 보이면서 마치겠습니다. 제가 만든 것은 아닙니다. 정리가 잘 된 것이 있어서 가져와봤습니다. 출처 : http://www.slideshare.net/andersgoransson/efficient-android- threading?qid=e3547e63-db44-4260-aae8- 933367c75245&v=qf1&b=&from_search=1 5 Thread Pool