В настоящее время я пытаюсь смоделировать фабрику, которая строит самолеты, на фабрике есть 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
. Этот класс проверяет наличие самолетов в arrayBlockingQueue, принадлежащем классу factory
. И если таковые имеются, присваивает их потоку роботов на основе некоторой логики c:
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, похоже, не влияет на потоки в службе executor.
Основная проблема, которую я есть сейчас это. Существует фиксированное количество 10 потоков робота, однако пользователь, запускающий программу, устанавливает начальное количество самолетов. Это означает, что я не могу просто сделать что-то вроде while(!queue.isEmpty()){//robot thread do work}
, потому что сама очередь может быть пустой, но это не значит, что другие роботы в программе закончили запуск своей логики c.
Есть ли способ во время выполнения, чтобы получить доступ к этим объектам робота из службы исполнителя, чтобы я мог установить для их активного поля значение false после определенного периода времени или условия? Я однажды пытался отправить их в Executorservice
, а затем пытался добавить их в arrayList, но ничего, что я сделал с объектами робота в arraylist, казалось, не влияло на потоки в пуле потоков.