доступ к указанным c потокам в службе исполнителя - PullRequest
1 голос
/ 22 марта 2020

В настоящее время я пытаюсь смоделировать фабрику, которая строит самолеты, на фабрике есть 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, казалось, не влияло на потоки в пуле потоков.

...