在我的服务中,我需要有 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 个选项...
如果目录名称或多或少并不重要,请使用任务中的线程名称来指定目录并使用
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;
}
使用 Java 并发集合,如 ConcurrentLinkedDeque跟踪空闲目录并从任务本身访问它。当目录不可用时,需要有一个逻辑
关于java - Spring @asynch 线程并发共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33610934/