Spring boot 多线程两种方式

最简单的Runnable 之类的不再赘述。

第一种:spring封装的线程池

  • 首先定义配置类,这个配置类需要实现AsyncConfiguer接口,并实现它的方法
  1. 异步线程的执行者,在里面配置自动执行的东西,比如线程池参数
  2. 线程异常处理
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
* Created with IntelliJ IDEA.
* http://ichenqiang.com
*
* @author iChenQiang
* @version 1.0
* @Date: 2019/7/16 14:18
* @Description:
*/
@Configuration
@EnableAsync
public class ExecutorConfig implements AsyncConfigurer {

private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

/**
* TODO: 此方法名称为asyncPromiseExecutor,即在spring中注入了一个名字为asyncPromiseExecutor的bean
* 方法名只要在项目中唯一性,可以适当任意取(最好遵循一定的规则)
* 使用方法:在需要加入线程池的方法上增加注解@Async("asyncPromiseExecutor")就可以加入此线程池异步执行
*/
@Bean
public Executor asyncPromiseExecutor() {
logger.info("Starting AsyncPromiseExecutor!");
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//配置核心线程数
executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
//最大线程数量
executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 5);
//线程池的队列容量
executor.setQueueCapacity(Runtime.getRuntime().availableProcessors() * 5);
// executor.setCorePoolSize(5);
// executor.setMaxPoolSize(20);
// executor.setQueueCapacity(30);
executor.setThreadNamePrefix("fastcloud-kingdm-");
/**
* rejection-policy:当pool已经达到max size的时候,如何处理新任务
* CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
*/
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
//初始化执行器
executor.initialize();
return executor;
}

/*异步任务中异常处理*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new SimpleAsyncUncaughtExceptionHandler();
}
}
  • 创建线程任务执行类
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class TreadTasks {
    @Async
    public void startMyTreadTask() {
        System.out.println("this is my async task");
    }
}
  • 调用异步线程任务
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import ds.watsons.app.label.service.TreadTasks;

@Controller
public class AsyncTaskUse {
    @Autowired
    private TreadTasks treadTasks;
    @GetMapping("/startMysync")
    public void useMySyncTask() {
        treadTasks.startMyTreadTask();
    }
}

第二种:异步处理最简单的代码

public void test(){
new Thread(()->doReplace(replaceLog)).start();
}

public void doReplace(String replaceLog){
//异步处理的业务
}

CentOS 7 升级内核至ELRepo仓库的最新Linux 内核

1.相关链接

2.查看当前的内核版本

  • # uname -r

    4.19.8-1.el7.elrepo.x86_64


    # uname -a


    Linux vps.com 4.19.8-1.el7.elrepo.x86_64 #1 SMP Sat Dec 8 10:07:47 EST 2018 x86_64 x86_64 x86_64 GNU/Linux


    # cat /etc/redhat-release


    CentOS Linux release 7.6.1810 (Core)

3.升级内核

① 可以先更新update:yum -y update

② 启用 ELRepo 仓库:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

③ 查看可用的系统内核包:

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

④ 安装最新内核

yum --enablerepo=elrepo-kernel install kernel-ml

⑤ 设置内核启动

#查看系统上的所有可以内核

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

#编号为 0 的内核作为默认内核

grub2-set-default 0

#通过 gurb2-mkconfig 命令创建 grub2 的配置文件

grub2-mkconfig -o /boot/grub2/grub.cfg

#然后重启

reboot

#重启后可以通过 uname -r 查看是否生效

⑥ 删除旧内核

查看系统中全部的内核:rpm -qa | grep kernel

删除旧内核的 RPM 包(例):yum remove kernel-headers-3.10.0-514.26.2.el7.x86_64 kernel-3.10.0-514.26.2.el7.x86_64

给centos7重新安装软件源

很多vps商家自带的centos都是修改了软件源的,这时我们想恢复官方软件源。但是官方源中自带的软件不多,因而需要一些第三方源,比如EPEL、ATrpms、ELRepo、Nux Dextop、RepoForge等。

  • 清理旧仓库
# 清除缓存
yum clean all
rm -rf /var/cache/yum
# 卸载epel仓库
yum remove epel-release
# 删除所有旧仓库文件
# 注意,如有其它仓库文件请自行重装或选择性删除
rm -rf /etc/yum.repos.d/*
  • EPEL
    EPEL即Extra Packages for Enterprise Linux,为CentOS提供了额外的10000多个软件包,而且在不替换系统组件方面下了很多功夫,因而可以放心使用。
  • Remi
    Remi源大家或许很少听说,不过Remi源GoFace强烈推荐,尤其对于不想编译最新版的linux使用者,因为Remi源中的软件几乎都是最新稳定版。或许您会怀疑稳定不?放心吧,这些都是Linux骨灰级的玩家编译好放进源里的,他们对于系统环境和软件编译参数的熟悉程度毋庸置疑。
  • RPMForge
    RPMForge是CentOS系统下的软件仓库,拥有4000多种的软件包,被CentOS社区认为是最安全也是最稳定的一个软件仓库。
# 官方源
rpm -Uvh --force http://mirror.centos.org/centos-7/7/os/x86_64/Packages/centos-release-7-5.1804.el7.centos.x86_64.rpm
# EPEL
yum install epel-release
# rpmforge
rpm -Uvh http://repository.it4i.cz/mirrors/repoforge/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
# 生成缓存
yum clean all
yum makecache