项目中在计算权限的时候有性能有问题,简单的使用多线程的方式改造了下,在这个地方记录一下,防止遗忘。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.apache.commons.lang.StringUtils;
import com.xxx.zzz.account.model.Account;
import com.xxx.zzz.common.ServiceBeanFactory;
import com.xxx.zzz.common.exception.ZZZRuntimeException;
import com.xxx.zzz.common.log.LoggerHelper;
import com.xxx.zzz.resource.model.Resource;
public class ConcurrentAccountTreeCalculator {
private final static int MAX_THREAD = 20;
private final static int TASK_PER_THREAD = 5;
private static ExecutorService initExecutor(int taskNum){
int threadNum = 0;
if(taskNum / TASK_PER_THREAD > MAX_THREAD){
threadNum = MAX_THREAD;
} else {
threadNum = (taskNum / TASK_PER_THREAD) + 1;
}
return Executors.newFixedThreadPool(threadNum);
}
public static Set<String> calculate(List<String> userNames,Resource resource){
List<Future<String>> futures = new ArrayList<Future<String>>();
Set<String> destNames = new HashSet<String>(userNames);
int taskSize = userNames.size();
ExecutorService exec = initExecutor(taskSize);
List<Callable<String>> tasks = new ArrayList<Callable<String>>(taskSize);
for(String userName : userNames){
AccountTreeCalculator calculator = new AccountTreeCalculator(userName,resource);
tasks.add(calculator);
}
try {
for (Callable<String> callable : tasks) {
futures.add(exec.submit(callable));
}
for (Future<String> future : futures) {
String destUserName = future.get();
if(StringUtils.isNotBlank(destUserName)){
destNames.remove(destUserName);
}
}
} catch(Exception e){
LoggerHelper.err(ConcurrentAccountTreeCalculator.class, "计算人员权限出错", e);
}
return destNames;
}
static class AccountTreeCalculator implements Callable<String> {
private String userName;
private Resource resource;
public AccountTreeCalculator(String userName,Resource resource) {
this.userName = userName;
this.resource = resource;
}
@Override
public String call() {
try {
Account account = ServiceBeanFactory.getAccountService().getByName(userName);
if(account == null){
throw new SpmRuntimeException(String.format("Can't find user:%s", userName));
}
boolean hasPermisison = ServiceBeanFactory.getResourceService().hasPermission(resource, account);
if(hasPermisison) {
return account.getName();
}
} catch(Exception e){
LoggerHelper.err(this.getClass(), "计算人员权限出错", e);
}
return null;
}
}
}
这个实现的非常简单,我这里就不解释了,AccountTreeCalculator实现了Callable接口,这个里面实现具体的计算逻辑,然后将任务提交给ExecutorService来进行计算,future.get()会等待子线程返回结果,所以整个程序很好理解。
短小精悍但是比较有用。
分享到:
相关推荐
在这个“易语言多线程执行任务例程”中,我们将深入探讨如何在易语言中利用多线程技术来提升程序的运行效率和并发能力。 多线程是现代计算机编程中的一个重要概念,它允许一个程序同时执行多个任务,从而充分利用...
乐玩8.172游戏自动登录多线程执行任务的易语言源码,是针对特定游戏版本(乐玩8.172)设计的一种自动化工具。这种工具的主要功能是帮助玩家实现游戏内的自动化操作,比如自动登录、执行师门任务、宝图任务、帮派任务...
本篇文章将深入探讨多线程执行任务的具体实现方式。 一、线程的概念与优势 线程是操作系统分配CPU时间的基本单元,一个进程可以包含一个或多个线程。相比于单线程,多线程能充分利用多核处理器资源,减少程序等待I/...
在IT领域,多线程并发执行任务是一种常见的优化策略,特别是在服务器端开发、实时系统以及高性能计算中。本文将深入探讨多线程并发执行任务的相关知识点,并基于提供的`MyThread.java`文件,来分析和理解如何在Java...
在“易语言-易语言多线程执行任务例程”中,我们可以学习到如何在易语言环境中创建和管理多线程。多线程技术的核心在于并发执行,通过合理分配系统资源,使得程序的各个部分可以并行工作,从而减少整体的等待时间。 ...
而多线程则允许程序同时执行多个任务,每个任务在独立的线程中运行,互不干扰。在下载软件中,多线程可以将大文件分割成多个小部分,分别由不同的线程下载,显著提升了下载速度。 本软件的多任务处理功能则意味着...
在IT行业中,多线程并行执行是一种常见的优化策略,特别是在处理大数据量或者需要高性能计算的任务时。"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率...
声明BigJob 对 像(包括事件),创建BigJob 的实 例,通知对像执行任务,在对像的“ 开 始”事件中给用户一些提示,数字时钟”在不间断地显示当前时间。 不足之处:终止任务(关闭窗体)时 Activex.exe 部件需要...
本篇文章将深入探讨C#中的多线程执行,并结合“TaskSortRelationArrange”这个文件名,推测其可能涉及到的任务排序与关系安排。 一、C#多线程基础 C#中的多线程主要依赖于System.Threading命名空间,其中Thread类是...
总结起来,"c# 多线程 异步进度条"涉及如何在C#中利用多线程执行任务,同时通过异步机制和进度条组件,向用户展示任务执行的实时进度。正确实现这一功能需要理解多线程的创建与同步,异步编程的原理,以及UI线程安全...
多线程则允许我们同时执行多个任务,每个任务在一个独立的线程上运行,从而提高效率并保持UI的流畅。 在Winform中,我们可以使用`System.Threading`命名空间中的类来创建和管理线程。最常用的是`Thread`类,它代表...
4. 工作线程执行任务,完成后调用`done.countDown()`,减少`done`的计数。 5. 主线程等待所有任务完成(`done.await()`返回),然后计算并返回总执行时间。 这个设计巧妙地利用了`CountDownLatch`来确保所有线程在...
### 多线程计数实现多线程执行后再执行主线程 #### 一、知识点概述 本文将深入探讨如何利用`CountDownLatch`机制来确保多个子线程完成各自的任务后,再让主线程继续执行的方法。这种方法在项目开发中非常实用,...
在这个“易语言源代码_多线程多任务下载软件.zip”压缩包中,包含了一个使用易语言编写的多线程多任务下载软件的源代码,主要文件名为“多线程多任务下载软件.e”。 多线程技术在软件开发中扮演着重要角色,尤其是...
在Go语言中,实现多线程定时任务是一个常见的需求,特别是在服务器端编程或者后台任务处理中。Go语言的并发模型是基于CSP(Communicating Sequential Processes)理论的,通过goroutine和channel来实现轻量级线程和...
主要实现了,多个线程任务在同时执行的情况下,保证线程任务顺序的问题。更通俗来说,就是保证Thread1一定在thread2,thread3之后才能执行。另外,代码里我写了详细的注释,和测试的效果,绝对让你能看懂。还有我传的...
在C#编程中,多线程和多任务管理是一个关键的概念,它允许程序同时执行多个独立的任务,提高程序的响应速度和效率。本压缩包文件"**C#多线程多任务管理模型**"提供了相关的代码示例和项目资源,帮助开发者深入理解和...
在Qt框架中,多线程处理多任务是提高应用程序性能和响应能力的重要手段。Qt提供了丰富的多线程支持,使得开发者能够充分利用现代计算机的多核处理器资源,避免UI线程因执行耗时操作而导致的界面假死问题。本文将深入...
在iOS中,多线程是指在一个应用程序中同时执行多个线程。主线程主要负责UI更新,保持用户界面的流畅性;而子线程则用于处理耗时操作,如网络请求和数据处理。多线程能够有效利用CPU资源,提高程序运行效率。 多任务...