springboot異步線程(一)

前言

在本篇文章中,我們主要討論spring異步編程的一些相關知識,不涉及實戰。springboot版本2.2.1

TaskExecutor

spring2.0後提出TaskExecutor接口,作爲任務執行者抽象。TaskExecutor源碼:


@FunctionalInterface
public interface TaskExecutor extends Executor {
	@Override
	void execute(Runnable task);

}

spring框架提供了一定的TaskExecutor實現類,這些實現類可以完成幾乎所有使用場景的覆蓋,所以,大多數情況下,我們沒有必要實現某個TaskExecutor

  1. SyncTaskExecutor
    代碼如下:

public class SyncTaskExecutor implements TaskExecutor, Serializable {
	@Override
	public void execute(Runnable task) {
		Assert.notNull(task, "Runnable must not be null");
		task.run();
	}

}

可以發現,提交給SyncTaskExecutor的任務都是直接在當前線程中執行

  1. SimpleAsyncTaskExecutor
    @Override
	public void execute(Runnable task, long startTimeout) {
		Assert.notNull(task, "Runnable must not be null");
		Runnable taskToUse = (this.taskDecorator != null ? this.taskDecorator.decorate(task) : task);
		if (isThrottleActive() && startTimeout > TIMEOUT_IMMEDIATE) {
			this.concurrencyThrottle.beforeAccess();
			doExecute(new ConcurrencyThrottlingRunnable(taskToUse));
		}
		else {
			doExecute(taskToUse);
		}
	}
	
	protected void doExecute(Runnable task) {
		Thread thread = (this.threadFactory != null ? this.threadFactory.newThread(task) : createThread(task));
		thread.start();
	}

提交給SimpleAsyncTaskExecutor的任務每次都新建一個線程來執行提交的任務。

  1. ThreadPoolTaskExecutor
    如果覺得SimpleAsyncTaskExecutor每次都需要新建線程不可取,就可以使用這個,ThreadPoolTaskExecutor改用線程池來管理並重用處理任務異步執行的工作線程。其中,ThreadPoolTaskExecutor的線程池功能是使用的jdk的ThreadPoolExecutor來實現的。

@Override
	public void execute(Runnable task) {
		Executor executor = getThreadPoolExecutor();
		try {
			executor.execute(task);
		}
		catch (RejectedExecutionException ex) {
			throw new TaskRejectedException("Executor [" + executor + "] did not accept task: " + task, ex);
		}
	}

  1. ConcurrentTaskExecutor
    ConcurrentTaskExecutorJava5ExecutorspringTaskExecutor搭建了一道橋樑使得我們可以將Executor框架下的某些實現類以TaskExecutor的形式公開來,如果我們感覺ThreadPoolTaskExecutor封裝的java.util.concurrent.ThreadPoolExecutor不足以満足當前場景需要,那麼可以構建需要的Executor實例,比如通過Executors.newXXXThreadPool(),然後以ConcurrentTaskExecutor對其進行封裝,封裝後獲得的ConcurrentTaskExecutor即獲得相應Executor的能力,但它現在是以TaskExecutor的樣子示人氣如下所示:

Executor executor =Executors .newScheduledThreadPool (10);
TaskExecutor taskExecutor = new ConcurrentTaskExecutor (executor):

最後

異步線程的一些相關知識知道了。接下來就是怎麼去使用了。

參考:

  1. Spring Boot Async Task Executor
  2. Spring 官方文檔
  3. 新手也能看懂的 SpringBoot 異步編程指南
  4. TaskExecutionAutoConfiguration
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章