zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    HTML5边玩边学(2)
    Get Mac NetBIOS
    NetBios协议详解及网上邻居工作原理
    DXperience Universal 10.1.6
    HTML5边玩边学(1)
    《UML和模式应用》读书笔记(二)
    static instance examples
    自己写的虚拟主机管理系统..和大家分享
    一个不错的net的User Interface Components
    Infragistics系列控件
  • 原文地址:https://www.cnblogs.com/guoyuchuan/p/11857233.html
Copyright © 2011-2022 走看看