Spring @asynch线程并发共享资源

时间:2015-11-09 14:06:53

标签: java multithreading spring threadpool

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

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

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

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

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

更新: 例:    executeAsynchMethod在每个可用线程上启动:
          thread1 - &gt;适用于目录1           thread2 - &gt;适用于目录2
                    ...
          threadn - &gt;适用于目录n
每当一个线程完成它的工作时,它“释放”它的目录,我希望在这个目录上运行一个任务            thread7 - &gt; directory7是免费的            thread7(或另一个免费线程) - &gt;在目录7上开始一项新任务

1 个答案:

答案 0 :(得分:1)

我看到2个选项......

  1. 如果目录名称或多或少无关紧要,请使用任务中的threadname指定目录并使用maximum number of threads <= number of directories配置threadpool,例如

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

    }

  2. 使用像ConcurrentLinkedDeque这样的Java Concurrent集合来跟踪免费目录并从任务本身访问它。当目录不可用时,需要有一个逻辑

相关问题