여기서 긁어 오자.
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:
믓튼 아래 꺼 보면 부른놈의 쓰레드에서 즉시 실행 될수도 있다.
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.
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(); 이거 여러개 적으면 여러개 되겄징?
뭐.. 써봐야 감이 오겠지만... 복작합 쓰레드가 요구되는 녀석이 필요할 때 쓰이면 좋겠다는 생각이 든다.
오 뭔가 복잡한 익스큐터를 보여준다. 클래스 이름처럼 순차적으로 실행하는 클래스인데 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.
댓글 없음:
댓글 쓰기
국정원의 댓글 공작을 지탄합니다.