java - 访问执行器服务中的特定线程
问题描述
我目前正在尝试模拟一个制造飞机的工厂,该工厂有 10 个机器人(线程)将在对象(飞机)上工作,直到没有更多的机器人。为此,我使用了ExecutorService
一个固定大小为 10 个线程的线程。机器人本身是一个扩展线程的自定义类,为了阻止他们的run()
方法立即完成我让机器人有一个名为 active 的布尔值,我将其设置为 true,如下所示:
public void run() {
while (this.active) {
while (this.workingAircraft == null) {
// System.out.println(this.getID() + " has no aircraft to work on, reporting to operator");
try {
this.workingAircraft = this.op.getAircraft(this.id);
// System.out.println(this.toString() + " has recieved aircraft" + this.workingAircraft.getID());
} catch (Exception ex) {
// System.out.println("Operator is busy");
try {
this.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if(this.workingAircraft !=null) {
//System.out.println(this.toString() + " is working on Aircraft " + this.workingAircraft.getID());
while (this.installAmount > 0) {
// System.out.println(" " + this.toString() + " :*clank* *clank*");
this.installAmount--;
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
// System.out.println(this.getID() + " has finished working on aircraft");
this.returnToQueue();
this.workingAircraft = null;
}
}
}
机器人线程与operator
类进行通信。此类检查是否存在属于某个factory
类的 arrayBlockingQueue 中的飞机。如果有,则根据一些逻辑将其分配给机器人线程:
public synchronized Aircraft getAircraft(int id) {
Aircraft a = this.factory.getAirCrafts().poll();
if(a.getPartsNeeded().contains(id)){
this.leaveWaiting(id); // remove the robot from the waitingList
return a; //only give a robot an aircraft if it has the desired parts
}
this.factory.getAirCrafts().add(a);
return null;
}
我正在将机器人提交给执行器服务,如下所示:
for (int i = 0; i < 10; i++) {
final Robot r = new Robot(this, i, operator);
//robots.add(r);
runningRobots.add(threadPool.submit(r));
}
我也尝试将机器人添加到 arrayList,并以这种方式访问它们,但是,在 arrayList 中调用机器人的方法似乎对执行程序服务中的线程没有影响。
我现在的主要问题是这个。有固定数量的 10 个机器人线程,但是运行程序的用户设置了初始的飞行器数量。这意味着我不能简单地做一些事情,while(!queue.isEmpty()){//robot thread do work}
因为队列本身可能是空的,但这并不意味着程序中的其他机器人已经完成了他们的逻辑。
在运行时有什么方法可以从执行程序服务访问这些机器人对象,以便我可以在一段时间或条件后将它们的活动字段设置为 false?我曾尝试将它们提交给Executorservice
然后尝试将它们添加到 arrayList 但我对 arraylist 中的机器人对象所做的任何事情似乎都不会影响线程池中的线程。
解决方案
推荐阅读
- arrays - 随机化从 rest-API 获取的测验答案
- windows-10 - 在使用的 IAR 8 和 STL552 评估板上,堆栈指针被初始化为 0x0000
- javascript - 有没有一种方法可以动态地将对象名称传递给函数(作为参数)并使用参数引用该对象的属性?
- rust - 有什么办法可以同时不可变和可变地借用 RefCell 吗?
- opencart - opencart 中的电子邮件问题
- javascript - Nuka-carousel 反应移动到某些幻灯片
- java - 是什么导致 Java JLabel 图标中的图像质量不佳?
- scala - 将 List[Either[A, B]] 转换为 Either[List[A], List[B]]
- kubernetes - 对 Kubernetes 清单文件中的值使用 ENV
- haskell - Haskell Emacs haskell-mode:运行“Ch f haskell-mode”以获取有关如何设置 Haskell 交互模式的说明