2012년 8월 1일 수요일

안드로이드 쓰레들 4/10

3편을 적었으니 4편을 적을 수 밖에 없다.



여기서 긁어 오자.
public interface

Executor

java.util.concurrent.Executor
Known Indirect Subclasses

Class Overview


An object that executes submitted Runnable tasks. This interface provides a way of decoupling task submission from the mechanics of how each task will be run, including details of thread use, scheduling,

스.케.쥴.링! 

결국 쓰레드 3/10편과 같은 ExecutorService랑 같은 넘이다. service는 어따 팔아무겄노...

 etc. An Executor is normally used instead of explicitly creating threads. For example, rather than invoking new Thread(new(RunnableTask())).start() for each of a set of tasks, you might use:
 Executor executor = anExecutor;
 executor.execute(new RunnableTask1());
 executor.execute(new RunnableTask2());
 ...

뭐 쓰는것도 같다. 익스큐터=집행자. 멋진 표현이다.

However, the Executor interface does not strictly require that execution be asynchronous. 
이건 먼말이여. 그러나 익스큐터 인터페이스는 엄밀한 비동기적 실행을 요구안한다. ... 동기적 실행을 원하는게 아닌가?
In the simplest case, an executor can run the submitted task immediately in the caller's thread:
믓튼 아래 꺼 보면 부른놈의 쓰레드에서 즉시 실행 될수도 있다.
 class DirectExecutor implements Executor { 오호... 이렇게도 쓸 수 있군...
     public void execute(Runnable r) {
         r.run();  그런데 이렇게 쓸 일이 있을까...
     }
 }
More typically, tasks are executed in some thread other than the caller's thread. The executor below spawns a new thread for each task.
 class ThreadPerTaskExecutor implements Executor {
     public void execute(Runnable r) {
         new Thread(r).start();
     }
 }
바로 눈에는 들어오지 않지만... Runnable을 받아서 새로 쓰레드를 만든다음 돌리고 있다.
r.run()과의 차이는
또 쓰레드 여러개 만들어서 돌려도 된다는 것이다.

new Thread(r).start(); 이거 여러개 적으면 여러개 되겄징?
뭐.. 써봐야 감이 오겠지만... 복작합 쓰레드가 요구되는 녀석이 필요할 때 쓰이면 좋겠다는 생각이 든다.

Many Executor implementations impose some sort of limitation on how and when tasks are scheduled. The executor below serializes the submission of tasks to a second executor, illustrating a composite executor.

오 뭔가 복잡한 익스큐터를 보여준다. 클래스 이름처럼 순차적으로 실행하는 클래스인데 deque에 넣고(offer) 빼서(pool) 실행시켜준다.

 어라. 그런데 왜 이렇게 복잡하게 하는거지 ㅡㅡ; 큐에 안넣고 걍 실행하면 안되나.
뭐... run하면서 또 다른 작업을 할 수 있게 코딩 몇 줄 더 적을 것 같긴 하다만...
아~  클래스가 Service 형태라면 좀 더 유용할 수도 있겠답! 오오오 난 천재.
 class SerialExecutor implements Executor {
   final Queue tasks = new ArrayDeque(); 옷 어레이! 
   final Executor executor;
   Runnable active;

   SerialExecutor(Executor executor) {
     this.executor = executor;
   

   public synchronized void execute(final Runnable r) {
     tasks.offer(new Runnable() {
       public void run() {
         try {
           r.run();
         } finally {
           scheduleNext();
         }
       }
     });
     if (active == null) {
       scheduleNext();
     }
   }

   protected synchronized void scheduleNext() {
     if ((active = tasks.poll()) != null) {
       executor.execute(active);
     }
   }
 }}
The Executor implementations provided in this package implement ExecutorService, which is a more extensive interface. The ThreadPoolExecutor class provides an extensible thread pool implementation. The Executors class provides convenient factory methods for these Executors.
Memory consistency effects: Actions in a thread prior to submitting a Runnable object to an Executor happen-before its execution begins, perhaps in another thread.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...