异步方法不能睡眠?

很奇怪 我在做redis缓存 异步缓存 但是这个异步的方法就是不睡眠 这改怎么处理 单独的线程也试了 同样不行 求解

调用的地方

网上找的配置 修改默认的异步的线程池

package cn.hk.framework.config;

import lombok.extern.slf4j.Slf4j;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;

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;

@Configuration

@EnableAsync

@Slf4j

public class AsyncConfiguration implements AsyncConfigurer {

@Bean(name = "asyncPoolTaskExecutor")

public ThreadPoolTaskExecutor executor() {

ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();

//核心线程数

taskExecutor.setCorePoolSize(2);

//线程池维护线程的最大数量,只有在缓冲队列满了之后才会申请超过核心线程数的线程

taskExecutor.setMaxPoolSize(10);

//缓存队列

taskExecutor.setQueueCapacity(50);

//许的空闲时间,当超过了核心线程出之外的线程在空闲时间到达之后会被销毁

taskExecutor.setKeepAliveSeconds(200);

//异步方法内部线程名称

taskExecutor.setThreadNamePrefix("async-");

/**

* 当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略

* 通常有以下四种策略:

* ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

* ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

* ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

* ThreadPoolExecutor.CallerRunsPolicy:重试添加当前的任务,自动重复调用 execute() 方法,直到成功

*/

taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

taskExecutor.initialize();

return taskExecutor;

}

/**

* 指定默认线程池

*/

@Override

public Executor getAsyncExecutor() {

return executor();

}

@Override

public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {

return (ex, method, params) ->

log.error("线程池执行任务发送未知错误,执行方法:{}",method.getName(),ex);

}

}

结果 现在好像可以了 就是多个线程都异步执行 就像线程一 在停5s中别的线程进入方法在停5s 这是不是要加锁


回答:

随手写了个demo,目测没有问题
但是
虽然sleep了,但是还会占用线程,如果线程池不够大会导致后续的任务堆积,如果真的有延时执行的需求,建议弄一个 ScheduledExecutorService 然后用 scheduleWithFixedDelay 提交延时任务
另外就和你在问题回复里说的一样,多线程操作如果有线程安全问题最好还是加个锁

以上是 异步方法不能睡眠? 的全部内容, 来源链接: utcz.com/p/944835.html

回到顶部