Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. # 자바 비동기 프로그래밍 파헤치기 - Executor - 자바8 docs 번역
  2.  
  3. ## SubInterface
  4. ExecutorService, ScheduledExecutorService
  5.  
  6. ## 구현 클래스
  7. AbstractExecutorService, ForkJoinPool, SchduledThreadPoolExecutor, ThreadPoolExecutor
  8. ***
  9. **public interface Executor**
  10.  
  11. 제출(submit)된 Runnable task를 실행하는 객체입니다. 이 인터페이스는 task submission(제출)을 다음의 과정들로부터 분리시키는 방식을 제공합니다. 그 과정에는 task의 운영, 스레드 사용의 세부사항, 스케쥴링 등등 이 있습니다.
  12.  
  13. Executor는 대게 직접적으로 스레드를 생성하는 것을 대체해 사용됩니다.
  14. 예를 들어, new Thread(new(RunnableTask())).start() 를 각 task 셋에 대해 실행하는 것보다 다음과 같이 사용할 수 있습니다.
  15. ```
  16. Executor executor = _anExecutor_;
  17. executor.execute(new RunnableTask1());
  18. executor.execute(new RunnableTask2());
  19. ...
  20. ```
  21.  
  22. 그러나 Executor 인터페이스는 엄격하게 비동기방식으로 실행되는 것을 엄격하게 필요로 하지 않습니다. 가장 간단한 케이스에서 executor 객체는 제출받은 task를 즉시 caller의 스레드에서 실행할 수 있습니다.
  23.  
  24. ```
  25. class DirectExecutor implements Executor {
  26. public void execute(Runnable r) {
  27. r.run();
  28. }
  29. }
  30. ```
  31. ` 하지만 보통 이렇게 하려고 비동기 방식을 이용하진 않는다. `
  32.  
  33. 대부분의 경우는 task들은 caller의 스레드보단 다른 스레드에서 실행됩니다. 아래의 executor 각각의 task에 대해 새로운 thread를 생성합니다.
  34. ```
  35. class ThreadPerTaskExecutor implements Executor {
  36. public void execute(Runnable r) {
  37. new Thread(r).start();
  38. }
  39. }
  40. ```
  41.  
  42. 많은 Executor 구현들은 몇몇 제한을 task들이 어떻게 그리고 언제 스케쥴될지 몇가지 제한을 부과합니다.
  43. The executor below serializes the submission of tasks to a second executor, illustrating a composite executor.
  44. ` 아마 아래의 executor가 작업을 실행후 다음 executor를 실행해 큐의 작업을 연속으로(serialize) 실행하는 걸 설명하는 듯하다. `
  45. ` serialize가 직렬화를 말하는건지, 연속된 뭔가를 실행한다는 식의 의미로 쓰인건지 확실하지 않으므로 원문 그대로 넣었다`
  46.  
  47.  
  48. ```
  49. class SerialExecutor implements Executor {
  50. final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
  51. final Executor executor;
  52. Runnable active;
  53.  
  54. SerialExecutor(Executor executor) {
  55. this.executor = executor;
  56. }
  57.  
  58. public synchronized void execute(final Runnable r) {
  59. tasks.offer(new Runnable() {
  60. public void run() {
  61. try {
  62. r.run();
  63. } finally {
  64. scheduleNext();
  65. }
  66. }
  67. });
  68. if (active == null) {
  69. scheduleNext();
  70. }
  71. }
  72.  
  73. protected synchronized void scheduleNext() {
  74. if ((active = tasks.poll()) != null) {
  75. executor.execute(active);
  76. }
  77. }
  78. }
  79. ```
  80.  
  81. ` active의 의미를 잘 모르겠으나 위 코드는 큐에 담긴 task들을 순차적으로 executor를 호출하며 비동기 방식으로 실행하는 코드인 듯하다 `
  82.  
  83. Executor는 ExecutorService, ThreadPoolExecutor, Executors 의 상위에 있는 인터페이스이다.
  84. ExecutorService는 더 넓은 범위에 쓰이는 인터페이스이며,
  85. ThreadPoolExecutor는 확장 가능한 thread pool의 구현을 제공한다.
  86. Executors 클래스는 편리한 팩토리 메서드들을 지원한다.
  87.  
  88.  
  89. ## Methods
  90.  
  91. ## execute
  92. void excute(Runnable command)
  93.  
  94. 주어진 명령을 미래에 있을 어떤 시간에 해냅니다(execute. 단지 실행 자체의 의미는 아니다).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement