首页 > 解决方案 > 访问执行器服务中的特定线程

问题描述

我目前正在尝试模拟一个制造飞机的工厂,该工厂有 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 中的机器人对象所做的任何事情似乎都不会影响线程池中的线程。

标签: javaconcurrencyexecutorservice

解决方案


推荐阅读