java - Spring @asynch 线程并发共享资源

标签 java multithreading spring threadpool

在我的服务中,我需要有 n 个不同的线程,在 n 个不同的目录上运行内容(n 从 1 到 8)。

我需要执行k个不同的任务(k从1到10000),每个任务都绑定(bind)到一个目录,我需要执行仅当 n1 上没有 Activity 线程时,n1 目录上的 k1 任务。

我是 Spring 新手,我想使用 @async 注释,但我不明白在这种情况下如何设置池。

for(int task = 1; task<=1000;task++){
   executeAsynchMethod( directoryNumber);
}

executeAsynchMethod 应保持空闲状态,直到同一目录上没有其他任务为止。

更新: 例子: executeAsynchMethod 在每个可用线程上启动:
thread1 -> 在目录 1 上工作
thread2 -> 在目录 2 上工作
...
threadn -> 适用于目录 n
每当线程完成其工作时,它就会“释放”其目录,并且我希望任务在此目录上运行。
thread7 -> Directory7 是免费的
thread7(或另一个空闲线程)->在directory7上启动一个新任务

最佳答案

我看到 2 个选项...

  1. 如果目录名称或多或少并不重要,请使用任务中的线程名称来指定目录并使用maximum number of threads <= number of directories配置线程池。 ,例如

     @Override
     @Bean
    public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setMaxPoolSize(numberofdirectories);
    executor.setCorePoolSize(corepoolsize);
    executor.setThreadNamePrefix("directorynameprefix");
    
    return executor;
    

    }

  2. 使用 Java 并发集合,如 ConcurrentLinkedDeque跟踪空闲目录并从任务本身访问它。当目录不可用时,需要有一个逻辑

关于java - Spring @asynch 线程并发共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610934/

相关文章:

node.js - 网络 worker 线程 : is it OK to use "require" inside worker?

java - 在 Java 线程中等待和通知给定的时间间隔

spring - 自定义 spring 属性源无法解析 @Value 中的占位符

java - Google Cloud SQL JDBC 套接字工厂 UnknownHostException : google

java - 如何将对象从 Spring 3.0 Controller 传递到 JSP View 并使用 JSTL 进行测试

java - 我们可以在接口(interface)中使用私有(private)或 protected 成员变量吗?

java - 检测字符串是否包含特定字符的最快方法

java - while 循环内的 if/else 语句

Java 线程无声地崩溃 - 我无法捕获异常

java - CompletableFuture 与 Spring 事务