Async异步线程创建方式

Async的两种创建方式
注意点

1.异步方法类不要和调用类在一个类里,异步不生效

2.异步方法类必须是spring管理

3.调用异步类的类,注入异步方法类bean,进行调用

4.@bean的方式,最好指定名字,或者和配置类方法名保持一致,不然失效

原因不知道,实测过

第一种:@bean

测试的接口

@RestController
@RequestMapping("/async")
public class TestAsync {
    @Autowired
    private DoRun doRun;

    @RequestMapping("/test")
    public String test() {
        System.out.println("当前线程是:" + Thread.currentThread().getName() + ",准备完成");
        try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("do之前");
            doRun.doRun();
            System.out.println("do之后");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程已经做完了");
        return "ok";
    }
}

配置异步线程

@Configuration
public class AsyncConfig {
    @Bean(name = "dorun") //这里指定名字,默认getAsyncExecutor,如果注入bean对应不是,失效
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(2);
        taskExecutor.setKeepAliveSeconds(300000);
        taskExecutor.setMaxPoolSize(4);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.setThreadNamePrefix("test001--------");
        taskExecutor.initialize();
        return taskExecutor;
    }
}

异步做的方法类

@Component
public class DoRun {
    @Async("dorun")
    public void doRun(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("进入异步调度");
        System.out.println("当前线程是:"+Thread.currentThread().getName()+",准备完成");
    }
}
第二种:AsyncConfigurer

测试接口类

@RestController
@RequestMapping("/async")
public class TestAsync {
    @Autowired
    private DoRun doRun;

    @RequestMapping("/test")
    public String test() {
        System.out.println("当前线程是:" + Thread.currentThread().getName() + ",准备完成");
        try {
            TimeUnit.SECONDS.sleep(3);
            System.out.println("do之前");
            doRun.doRun();
            System.out.println("do之后");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程已经做完了");
        return "ok";
    }
}

配置线程类

@Configuration
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(2);
        taskExecutor.setKeepAliveSeconds(300000);
        taskExecutor.setMaxPoolSize(4);
        taskExecutor.setQueueCapacity(20);
        taskExecutor.setThreadNamePrefix("test001--------ws");
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

异步做的方法类

@Component
public class DoRun {
    @Async
    public void doRun(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("进入异步调度");
        System.out.println("当前线程是:"+Thread.currentThread().getName()+",准备完成");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值