2015-11-09 84 views
0

在我的服务,我需要有ňň不同的目录(ñ变为1〜8)运行的东西,不同的线程。春@asynch线程并发共享资源

我需要执行ķ不同的任务(ķ进入为1〜10000),每个任务被绑定到单个目录,我需要在N1目录执行K1任务只有当n1上没有活动线程。

我是新来的春天,我想用@Async注释,我已经不知道如何设置池在这种情况下。

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

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

UPDATE: 例如: 的executeAsynchMethod开始在每一个可用线程:
线程1 - >适用于目录1
线程2 - >适用于目录2
...
threadn - >适用于目录ñ
只要线程完成工作,它就会“释放”它的目录,并且我希望在这个目录上运行一个任务。
thread7 - > directory7是免费
thread7(或其他空闲线程) - >开始directory7新任务

+0

你可以预先通过他们必须运行的目录来分割任务,然后依次运行它们吗? – jny

+0

不可以,因为任务可以有非常不同的执行时间(从10秒到10分钟),并且我希望在整个执行过程中所有可能的线程都处于活动状态。 我甚至不知道这是较长的任务:d – Jacopo

+0

但是,如果有关于N1目录X1的​​任务,执行时间将至少需要X1×持续时间,无论你做什么。但是,如果一些其他的任务将花费更少的时间,'ThreadPool'将确保下一个任务将被释放出来的任务得到执行。 – jny

回答

1

我看到2个选项...

  1. 如果目录名或更多少不要紧,使用任务中的threadname到指定的目录,并与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 Concurrent集合像ConcurrentLinkedDeque来跟踪空闲目录并从任务本身访问它。当目录不可用的情况下,需要逻辑