- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试将 Quartz 顺序执行更改为并行执行。
它工作正常,性能方面,看起来不错,但生成的(创建的)线程没有被破坏。
仍处于Runnable
状态;为什么以及如何解决这个问题?请指导我。
代码在这里:
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
logger.error("Result Processing executed");
List<Object[]> lstOfExams = examService.getExamEntriesForProcessingResults();
String timeZone = messageService.getMessage("org.default_timezone", null, Locale.getDefault());
if(lstOfExams!=null&&!lstOfExams.isEmpty()){
ThreadPoolTaskExecutor threadPoolExecuter = new ThreadPoolTaskExecutor();
threadPoolExecuter.setCorePoolSize(lstOfExams.size());
threadPoolExecuter.setMaxPoolSize(lstOfExams.size()+1);
threadPoolExecuter.setBeanName("ThreadPoolTaskExecutor");
threadPoolExecuter.setQueueCapacity(100);
threadPoolExecuter.setThreadNamePrefix("ThreadForUpdateExamResult");
threadPoolExecuter.initialize();
for(Object[] obj : lstOfExams){
if(StringUtils.isNotBlank((String)obj[2]) ){
timeZone = obj[2].toString();
}
try {
Userexams userexams=examService.findUserExamById(Long.valueOf(obj[0].toString()));
if(userexams.getExamresult()==null){
UpdateUserExamDataThread task=new UpdateUserExamDataThread(obj,timeZone);
threadPoolExecuter.submit(task);
}
// testEvaluator.generateTestResultAsPerEvaluator(Long.valueOf(obj[0].toString()), obj[4].toString(), obj[3]==null?null:obj[3].toString(),timeZone ,obj[5].toString() ,obj[1].toString());
// logger.error("Percentage Marks:::::"+result.getPercentageCatScore());
} catch (Exception e) {
Log.error("Exception at ResultProcessingJob extends QuartzJobBean executeInternal(JobExecutionContext context) throws JobExecutionException",e);
continue;
}
}
threadPoolExecuter.shutdown();
}
}
UpdateUserExamDataThread .class
@Component
//@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
//public class UpdateUserExamDataThread extends ThreadLocal<String> //implements Runnable {
public class UpdateUserExamDataThread implements Runnable {
private Logger log = Logger.getLogger(UpdateUserExamDataThread.class);
@Autowired
ExamService examService;
@Autowired
TestEvaluator testEvaluator;
private Object[] obj;
private String timeZone;
public UpdateUserExamDataThread(Object[] obj,String timeZone) {
super();
this.obj = obj;
this.timeZone = timeZone;
}
@Override
public void run() {
String threadName=String.valueOf(obj[0]);
log.info("UpdateUserExamDataThread Start For:::::"+threadName);
testEvaluator.generateTestResultAsPerEvaluator(Long.valueOf(obj[0].toString()), obj[4].toString(), obj[3]==null?null:obj[3].toString(),timeZone ,obj[5].toString() ,obj[1].toString());
//update examResult
log.info("UpdateUserExamDataThread End For:::::"+threadName);
}
}
TestEvaluatorImpl.java
@Override
@Transactional
public Examresult generateTestResultAsPerEvaluator(Long userExamId, String evaluatorType, String codingLanguage,String timeZoneFollowed ,String inctenceId ,String userId) {
dbSchema = messageService.getMessage("database.default_schema", null, Locale.getDefault());
try {
//Some Methods
return examResult;
}catch(Exception e){
log.erorr(e);
}
}
如果需要,我可以提供线程转储文件。
最佳答案
您似乎在相同大小的考试中创建了一个线程池,这不是最优的。
// Core pool size is = number of exams
threadPoolExecuter.setCorePoolSize(lstOfExams.size());
// Max pool size is just 1 + exam size.
threadPoolExecuter.setMaxPoolSize(lstOfExams.size()+1);
您必须考虑:- 如果您创建一个线程池并启动它,则立即启动内核大小中定义的多个线程。
在您的情况下,我会将核心池大小设置为 5 或 10(这实际上取决于您的 objective-c PU 有多少核心和/或提交任务的 IO 绑定(bind)方式)。
最大池大小可以是其两倍,但在队列满之前它不会生效。
要让 Activity 线程的大小在提交的工作完成后减小,您必须设置 2 个参数。
setKeepAliveSeconds(int keepAliveSeconds) :如果线程在定义的秒数内未使用(默认为 60 秒,这是最佳的),它会让线程自动关闭,但这通常只是用于关闭非核心池线程的线程。
要在 keepAliveSeconds 之后关闭核心部分的线程,您必须将 setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) 设置为 true。只要应用程序正在运行,这通常是错误的,以保持核心池处于 Activity 状态。
我希望它有所帮助。
关于java - `ThreadPoolTaskExecutor` 线程在Spring执行后没有被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53118365/
我正在尝试将 Quartz 顺序执行更改为并行执行。 它工作正常,性能方面,看起来不错,但生成的(创建的)线程没有被破坏。 仍处于Runnable状态;为什么以及如何解决这个问题?请指导我。 代码在这
我是一名优秀的程序员,十分优秀!