Java 스레드 풀 사용(ThreadPoolExecutor 소개)
스레드 풀 사용 방법#
ThreadPoolExecutor 소개
먼저 Thread Pool Executor의 계승 관계를 보십시오: Thread Pool Executor는 Abstract Executor Service를 계승합니다. 그 중에서 Abstract Executor Service는 Executor Service 인터페이스를 실현했고 Executor Service는 Executor 인터페이스를 계승했습니다.
Executor 인터페이스에는 리셋 방법 execute(Runnable command)가 하나만 있습니다.public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}
인터페이스 Executor Service, 예를 들어 shutdown, 실시간으로 Excutor 실행을 닫을 수 있는 일련의 방법을 제공합니다.또한 Future 클래스를 통해 현재 작업 수행 상태를 판단할 수 있습니다.그리고 Submit 방법은 실행된 새로운 작업을 제출하는 데 사용되며, Future는 Excutor Service의 Submit 방법을 통해 되돌아옵니다.
추상류 Abstract Executor Service는 Executor Service의 일부 기능을 실현했다.예를 들어 submit (): /**
* Returns a {@code RunnableFuture} for the given runnable and default
* value.
*
* @param runnable the runnable task being wrapped
* @param value the default value for the returned future
* @param the type of the given value
* @return a {@code RunnableFuture} which, when run, will run the
* underlying runnable and which, as a {@code Future}, will yield
* the given value as its result and provide for cancellation of
* the underlying task
* @since 1.6
*/
protected RunnableFuture newTaskFor(Runnable runnable, T value) {
return new FutureTask(runnable, value);
}
/**
* Returns a {@code RunnableFuture} for the given callable task.
*
* @param callable the callable task being wrapped
* @param the type of the callable's result
* @return a {@code RunnableFuture} which, when run, will call the
* underlying callable and which, as a {@code Future}, will yield
* the callable's result as its result and provide for
* cancellation of the underlying task
* @since 1.6
*/
protected RunnableFuture newTaskFor(Callable callable) {
return new FutureTask(callable);
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future submit(Callable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
위의 반환 값이 FutureTask임을 알 수 있습니다.FutureTask는 Future 인터페이스를 간접적으로 구현합니다.중간에 Runnable 인터페이스가 있습니다.여기에서 그 기능을 아는 것은 말할 것도 없다.
마지막 라인 유지보수는 Thread Pool Executor 클래스에서 이루어집니다.다음은 ThreadPoolExecutor의 가장 핵심적인 구성 방법입니다.
매개변수 이름
작용
corePoolSize
코어 스레드 풀 크기
maximumPoolSize
최대 스레드 풀 크기
keepAliveTime
스레드 풀에서 코어PoolSize 수를 초과한 빈 스레드의 최대 생존 시간;allowCoreThreadTimeOut(true)으로 핵심 스레드의 유효 시간을 설정할 수 있음
TimeUnit
keepaliveTime 시간 단위
workQueue
작업 대기열 차단
threadFactory
새 라인 공장
RejectedExecutionHandler
제출 작업 수가 maxmumPoolSize+workQueue의 합을 초과하면 작업은 RejectedExecutionHandler에 맡기고 처리합니다
1. 스레드 풀이 코어PoolSize보다 작을 때, 새 제출 작업은 새 스레드 실행 작업을 만듭니다. 이때 스레드 풀에 빈 스레드가 존재하더라도.2. 스레드 풀이 corePoolSize에 도달하면 새 제출 작업은workQueue에 넣고 스레드 풀의 작업 스케줄링이 실행될 때까지 기다립니다.workQueue가 가득 차고 maximumPoolSize>corePoolSize가 되면 새 제출 작업은 새 라인을 만들어서 작업을 수행합니다. 4.제출 작업 수가 maximumPoolSize를 초과하면 새 제출 작업은 RejectedExecutionHandler가 처리합니다.스레드 풀에서 corePoolSize 스레드를 초과하고 유휴 시간이 keepaliveTime에 도달하면 유휴 스레드를 닫습니다. 6.allowCoreThreadTimeOut(true)을 설정하면 스레드 풀의 corePoolSize 스레드 유휴 시간이 keepaliveTime에 도달하면 닫힙니다.
스레드 풀의 몇 가지 일반적인 생성 방식: Executors가 제공하는 스레드 풀 구성 방안
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}
/**
* Returns a {@code RunnableFuture} for the given runnable and default
* value.
*
* @param runnable the runnable task being wrapped
* @param value the default value for the returned future
* @param the type of the given value
* @return a {@code RunnableFuture} which, when run, will run the
* underlying runnable and which, as a {@code Future}, will yield
* the given value as its result and provide for cancellation of
* the underlying task
* @since 1.6
*/
protected RunnableFuture newTaskFor(Runnable runnable, T value) {
return new FutureTask(runnable, value);
}
/**
* Returns a {@code RunnableFuture} for the given callable task.
*
* @param callable the callable task being wrapped
* @param the type of the callable's result
* @return a {@code RunnableFuture} which, when run, will call the
* underlying callable and which, as a {@code Future}, will yield
* the callable's result as its result and provide for
* cancellation of the underlying task
* @since 1.6
*/
protected RunnableFuture newTaskFor(Callable callable) {
return new FutureTask(callable);
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
/**
* @throws RejectedExecutionException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
*/
public Future submit(Callable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
ExecutorService es = Executors.newCachedThreadPool();
ExecutorService es = Executors.newFixedThreadPool(2);
ExecutorService es = Executors.newSingleThreadExecutor();
ScheduledExecutorService es = Executors.newScheduledThreadPool(2);
ThreadPoolExecutor를 통해 스레드 풀 생성 ##
상기 Executors는 공장 모드를 이용하여 우리에게 4가지 스레드 탱크 실현 방식을 제공했지만 사용을 추천하지 않습니다. 왜냐하면 Executors를 사용하여 스레드 탱크를 만드는 데 이 파라미터가 들어가지 않고 기본값을 사용하기 때문에 우리는 이 파라미터를 자주 무시합니다. 또한 기본적으로 사용하는 파라미터는 자원 낭비를 초래할 수 있기 때문에 바람직하지 않습니다.가장 좋은 것은ThreadPoolExecutor의 방식을 통해 이러한 처리 방식은 쓴 학생들이 스레드 탱크의 운행 규칙을 더욱 명확하게 하고 자원 소모의 위험을 피하도록 한다.
ThreadPoolExecutor cachedThreadPool = new ThreadPoolExecutor(
0,
Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue(),
new ThreadPoolExecutor.AbortPolicy());
cachedThreadPool.execute(new Runnable() {
@Override
public void run() {
}
});
cachedThreadPool.shutdown();
ThreadPoolExecutor singleThreadPool = new ThreadPoolExecutor(
2,
2,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
new ThreadPoolExecutor.AbortPolicy());
singleThreadPool.execute(new
Runnable() {
@Override
public void run () {
}
});
singleThreadPool.shutdown();
ThreadPoolExecutor singleThreadPool = new ThreadPoolExecutor(
1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
new ThreadPoolExecutor.AbortPolicy());
singleThreadPool.execute(new Runnable() {
@Override
public void run() {
}
});
singleThreadPool.shutdown();
//
executorService1.schedule(new TimerTask() {
@Override
public void run() {
finish();
startActivity(new Intent(WelcomeUI.this, TabUI.class));
}
},1, TimeUnit.SECONDS);
executorService1.shutdown();
ScheduledExecutorService executorService2 = new ScheduledThreadPoolExecutor(1,new ThreadPoolExecutor.AbortPolicy());
// 0 2
executorService2.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
finish();
startActivity(new Intent(WelcomeUI.this, TabUI.class));
}
},0, 2,TimeUnit.SECONDS);
executorService2.shutdown();
ScheduledExecutorService executorService3 = new ScheduledThreadPoolExecutor(1,new ThreadPoolExecutor.AbortPolicy());
// 5 3 ( 8 , 3 , 3 )
executorService3.scheduleWithFixedDelay (new TimerTask() {
@Override
public void run() {
finish();
startActivity(new Intent(WelcomeUI.this, TabUI.class));
}
},5, 3,TimeUnit.SECONDS);
executorService3.shutdown();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.