gpt4 book ai didi

java - `ThreadPoolTaskExecutor` 线程在Spring执行后没有被杀死

转载 作者:IT老高 更新时间:2023-10-28 13:50:27 29 4
gpt4 key购买 nike

我正在尝试将 Quartz 顺序执行更改为并行执行。

它工作正常,性能方面,看起来不错,但生成的(创建的)线程没有被破坏。

仍处于Runnable状态;为什么以及如何解决这个问题?请指导我。

enter image description here

代码在这里:

    @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);

您必须考虑:- 如果您创建一个线程池并启动它,则立即启动内核大小中定义的多个线程。

  • 最大池大小仅在您提交的核心池线程数超过当前可以处理的核心池线程并且队列大小已满(在本例中为 100)时才有效。这意味着只有当提交的任务数量超过 100+exam size 时才会创建一个新线程。

在您的情况下,我会将核心池大小设置为 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com