Java 병렬 프로그래밍에서 Executors 클래스를 사용하여 스레드를 만들고 관리하는 방법

9777 단어 JavaExecutors
1. 클래스 Executors
Executors 클래스는 도구 클래스로 볼 수 있습니다.JDK1.6 API의 설명을 참조하십시오.
이 패키지에 정의된 Executor, Executor Service, Scheduled Executor Service, ThreadFactory 및 Callable 클래스의 공장 및 실용적인 방법입니다.이러한 방식은 다음과 같은 여러 가지 방법을 지원합니다.
(1) 자주 사용하는 구성 문자열이 설정된 ExecutorService를 만들고 되돌려줍니다.
(2) 일반적인 구성 문자열이 설정된 ScheduledExecutor Service를 만들고 되돌려줍니다.
(3) "패키지된"Executor Service 방법을 만들고 되돌려줍니다. 특정한 방법에 접근할 수 없도록 함으로써 재구성을 비활성화합니다.
(4) 새로 만든 스레드를 알려진 상태로 설정하는 ThreadFactory를 만들고 되돌려줍니다.
(5) Callable이 필요한 실행 방법에 사용할 수 있도록 닫히지 않은 Callable 방법을 만들고 되돌려줍니다.
이 클래스를 통해 다양한 스레드 풀의 실례를 얻을 수 있습니다. 예를 들어 newSingleThreadExecutor () 를 호출하여 단일 스레드를 얻을 수 있는 Executor 서비스, newFixedThreadPool () 를 호출하여 고정된 크기의 스레드 풀을 얻을 수 있는 Executor 서비스 등입니다.Executor Service를 받으면 할 수 있는 일이 많습니다. 가장 간단한 것은 Runnable 대상을 실행하는 것입니다. 또한 Callable를 실현한 대상도 실행할 수 있습니다.Thread의 start () 방법으로 되돌아오는 값이 없습니다. 이 스레드가 실행되는 방법에 되돌아오는 값이 있다면 Executor Service를 사용하면 더할 나위 없이 좋습니다. submit (), invoke All () 또는 invoke Any () 를 선택하고 구체적인 상황에 따라 적당한 방법을 선택하면 됩니다.
다음과 같은 몇 가지 방법이 있습니다.
1.1 public static ExecutorService newCachedThreadPool()
필요에 따라 새 라인을 만들 수 있는 스레드 탱크를 만들지만, 이전에 구축된 스레드를 사용할 수 있을 때 다시 사용합니다.단기 비동기 작업을 많이 수행하는 프로그램에 대해 말하자면, 이러한 스레드 탱크는 통상적으로 프로그램 성능을 향상시킬 수 있다.
 
1.2 public static ExecutorService newFixedThreadPool(int nThreads)
고정된 스레드 수를 다시 사용할 수 있는 스레드 탱크를 만들고 공유된 무계 대기열 방식으로 이 스레드를 실행합니다.
 
1.3 public static ExecutorService newSingleThreadExecutor()
단일 Worker 라인을 사용하는 Executor를 만들어서 이 라인을 무계 대기열 방식으로 실행합니다.
 
이 세 가지 방법은 모두 인터페이스 ThreadFactory의 실례와 함께 사용할 수 있다.Executor Service 인터페이스의 인스턴스를 반환합니다.
2. 인터페이스 ThreadFactory
필요에 따라 새 라인을 만드는 대상입니다.스레드 공장을 사용하면 new Thread에 대한 호출을 수동으로 작성할 필요가 없기 때문에 응용 프로그램이 특수한 스레드 하위 클래스, 속성 등을 사용할 수 있습니다.
이 인터페이스의 가장 간단한 구현은 다음과 같습니다.

class SimpleThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
   return new Thread(r);
  }
 }
3. 인터페이스 ExecutorService
이 인터페이스는 관리가 중지되는 방법을 제공했다.
4. 표준 스레드 풀 시작 스레드 만들기
4.1 간단한 Runnable 인터페이스 구현 스레드 제공
MyThread.java

package com.zj.concurrency.executors;
 
public class MyThread implements Runnable {
  private int count = 1, number;
 
  public MyThread(int num) {
    number = num;
    System.out.println("Create Thread-" + number);
  }
 
  public void run() {
    while (true) {
      System.out.println("Thread-" + number + " run " + count+" time(s)");
      if (++count == 3)
       return;
    }
  }
}
이 라인은 상응하는 창설과 실행 정보를 출력합니다.
 
4.2 CachedThreadPool을 사용하여 스레드 시작
CachedThreadPool.java

package com.zj.concurrency.executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class CachedThreadPool {
  public static void main(String[] args) {
    ExecutorService exec = Executors.newCachedThreadPool();
    for (int i = 0; i < 5; i++)
      exec.execute(new MyThread(i));
    exec.shutdown();
  }
}
결과:

Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Create Thread-4
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
 
4.3 FixedThreadPool을 사용하여 스레드 시작

FixedThreadPool.java
package com.zj.concurrency.executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class FixedThreadPool {
  public static void main(String[] args) {
    ExecutorService exec = Executors.newFixedThreadPool(2);
    for (int i = 0; i < 5; i++)
      exec.execute(new MyThread(i));
    exec.shutdown();
  }
}
결과:

Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Create Thread-4
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
 
4.4 SingleThreadExecutor를 사용하여 스레드 시작
SingleThreadExecutor.java

package com.zj.concurrency.executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class SingleThreadExecutor {
  public static void main(String[] args) {
    ExecutorService exec = Executors.newSingleThreadExecutor();
    for (int i = 0; i < 5; i++)
      exec.execute(new MyThread(i));
    exec.shutdown();
  }
}
결과:

Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Create Thread-4
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
5. ThreadFactory 인터페이스와 함께 사용
우리는 라인에 데몬과priority의 속성 설정을 추가하려고 합니다.
5.1 백그라운드 스레드 속성 설정
DaemonThreadFactory.java

package com.zj.concurrency.executors.factory;
import java.util.concurrent.ThreadFactory;
 
public class DaemonThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setDaemon(true);
    return t;
  }
}
 
5.2 우선 순위 속성 설정
최고 우선 순위 MaxPriorityThreadFactory.java

package com.zj.concurrency.executors.factory;
import java.util.concurrent.ThreadFactory;
 
public class MaxPriorityThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setPriority(Thread.MAX_PRIORITY);
    return t;
  }
}
최소 우선 순위 MinPriorityThreadFactory.java

package com.zj.concurrency.executors.factory;
import java.util.concurrent.ThreadFactory;
 
public class MinPriorityThreadFactory implements ThreadFactory {
  public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setPriority(Thread.MIN_PRIORITY);
    return t;
  }
}
 
5.3 속성 설정이 있는 스레드 시작
ExecFromFactory.java

package com.zj.concurrency.executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.zj.concurrency.executors.factory.DaemonThreadFactory;
import com.zj.concurrency.executors.factory.MaxPriorityThreadFactory;
import com.zj.concurrency.executors.factory.MinPriorityThreadFactory;
 
public class ExecFromFactory {
  public static void main(String[] args) throws Exception {
    ExecutorService defaultExec = Executors.newCachedThreadPool();
    ExecutorService daemonExec = Executors
       .newCachedThreadPool(new DaemonThreadFactory());
    ExecutorService maxPriorityExec = Executors
       .newCachedThreadPool(new MaxPriorityThreadFactory());
    ExecutorService minPriorityExec = Executors
       .newCachedThreadPool(new MinPriorityThreadFactory());
    for (int i = 0; i < 10; i++)
      daemonExec.execute(new MyThread(i));
    for (int i = 10; i < 20; i++)
      if (i == 10)
       maxPriorityExec.execute(new MyThread(i));
      else if (i == 11)
       minPriorityExec.execute(new MyThread(i));
      else
       defaultExec.execute(new MyThread(i));
  }
}
결과:

Create Thread-0
Create Thread-1
Create Thread-2
Create Thread-3
Thread-0 run 1 time(s)
Thread-0 run 2 time(s)
Thread-1 run 1 time(s)
Thread-1 run 2 time(s)
Thread-2 run 1 time(s)
Thread-2 run 2 time(s)
Create Thread-4
Thread-4 run 1 time(s)
Thread-4 run 2 time(s)
Create Thread-5
Thread-5 run 1 time(s)
Thread-5 run 2 time(s)
Create Thread-6
Create Thread-7
Thread-7 run 1 time(s)
Thread-7 run 2 time(s)
Create Thread-8
Thread-8 run 1 time(s)
Thread-8 run 2 time(s)
Create Thread-9
Create Thread-10
Thread-10 run 1 time(s)
Thread-10 run 2 time(s)
Create Thread-11
Thread-9 run 1 time(s)
Thread-9 run 2 time(s)
Thread-6 run 1 time(s)
Thread-6 run 2 time(s)
Thread-3 run 1 time(s)
Thread-3 run 2 time(s)
Create Thread-12
Create Thread-13
Create Thread-14
Thread-12 run 1 time(s)
Thread-12 run 2 time(s)
Thread-13 run 1 time(s)
Thread-13 run 2 time(s)
Create Thread-15
Thread-15 run 1 time(s)
Thread-15 run 2 time(s)
Create Thread-16
Thread-16 run 1 time(s)
Thread-16 run 2 time(s)
Create Thread-17
Create Thread-18
Create Thread-19
Thread-14 run 1 time(s)
Thread-14 run 2 time(s)
Thread-17 run 1 time(s)
Thread-17 run 2 time(s)
Thread-18 run 1 time(s)
Thread-18 run 2 time(s)
Thread-19 run 1 time(s)
Thread-19 run 2 time(s)
Thread-11 run 1 time(s)
Thread-11 run 2 time(s)

좋은 웹페이지 즐겨찾기