Java 병렬 프로그래밍에서 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
다음과 같은 몇 가지 방법이 있습니다.
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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.