java-遍历通过ThreadPoolTaskExecutor运行的线程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-遍历通过ThreadPoolTaskExecutor运行的线程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2042字,纯文字阅读大概需要3分钟。
内容图文
![java-遍历通过ThreadPoolTaskExecutor运行的线程](/upload/InfoBanner/zyjiaocheng/683/9fa3d82e0dd34e6aa434a35a578aca2b.jpg)
我有一个ThreadPoolTask??Executor,当我创建一个实现Runnable的流程时,我通过以下方式运行它:executor.execute(process).
现在,在调用execute之前,我想检查Process对象中的一个字段,并将其与我的ThreadPoolTask??Executor执行的所有其他当前正在运行的进程进行比较.我该怎么做,而不产生并发问题?
码:
public class MyApp {
ThreadPoolTaskExecutor executor;
//...
public void runProcesses {
Process firstone = new Process(1);
Process nextOne = new Process(1);
// iterate through all processes started via executor and currently running,
// verify if there is any process.getX() == 1, if not run it
executor.execute(firstone );
//wait till firstone will end becouse have the same value of X
executor.execute(nextOne); // this cant be perform until the first one will end
}
}
public class Process {
private int x;
//...
public Process (int x){
this.x = x;
}
public int getX(){
return this.x;
}
}
我正在考虑创建一个简单的流程集,并开始添加新的流程集.但是我有一个问题,如何确定它是否仍在运行,并在完成后将其从设置中删除.所以现在我正在考虑遍历正在运行的线程,但完全不知道如何进行.
解决方法:
我认为您的最初想法很好,可以使它使用太多的代码.
为了使“已在运行此值的Runnable已运行”与“执行此Runnable”脱钩,需要进行一些修补,但是下面的粗略说明并未涉及到这一点:
>在Process中实现equals()和hashCode(),以便可以在无序集合和映射中安全地使用实例.
>创建一个ConcurrentMap< Process,Boolean>
>您将不会使用Collections.newSetFromMap(new ConcurrentHashMap< Process,Boolean>),因为您想使用地图的putIfAbsent()方法.
>尝试使用putIfAbsent()将其添加到要提交的每个流程中,如果返回的值不为null,则将其保全.
>非空返回值表示映射中已经存在一个等效的Process(因此正在处理).
>一个简单但不太干净的解决方案是在每个Process实例中插入对映射的引用,并在您的run()方法中首先执行putIfAbsent(this,true).
>从中删除完成处理的每个流程.
>琐碎且不太干净的解决方案是在每个Process实例中注入对映射的引用,并将remove(this)作为您在run()方法中要做的最后一件事.
>其他解决方案可以使Process实现Callable并返回其唯一值,以便可以将其从映射中删除,或者使用CompletableFuture及其thenAccept()回调.
Here’s一个示例,它说明了上述微不足道的解决方案(代码太长,无法直接在此处粘贴).
内容总结
以上是互联网集市为您收集整理的java-遍历通过ThreadPoolTaskExecutor运行的线程全部内容,希望文章能够帮你解决java-遍历通过ThreadPoolTaskExecutor运行的线程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。