在我的服务中,我需要 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上开始一项新任务
答案 0 :(得分:1)
我看到2个选项......
如果目录名称或多或少无关紧要,请使用任务中的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;
}
使用像ConcurrentLinkedDeque这样的Java Concurrent集合来跟踪免费目录并从任务本身访问它。当目录不可用时,需要有一个逻辑