繁体   English   中英

Java对象的并发

[英]Concurrency for objects in Java

我目前正在做一个练习,我必须在Java中设计一个小型简单的工业工厂。 基本上,我有一个用于存储的仓库,生产东西的机器以及一个接受命令并通知用户不同产品当前库存的GUI,等等。

但是,我几乎可以完成所有工作,但现在只能一次生产一台机器。 这可能是由于我对整个练习的态度。 我想启动程序的小型单元,并对其进行编码,这些单元可以独立工作,然后将它们逐个拼凑在一起,为应用程序添加越来越多的逻辑,并实现不同类之间的所有通信,等等。

现在,我似乎一切都很好,剩下要做的就是建立并发性,这样我就可以同时运行多台机器而没有任何问题。

为了让您更好地理解,我将尝试概述我的应用程序结构:

首先,有一个GUI和一个GUI控制器,可将用户所需的任务分配给应用程序中的其他控制器。 它还管理GUI的更新(库存,...)

然后,我得到了带有实际仓库(HSQLDB,基于文件,JDBC连接)和storageController的仓库部分,该仓库控制器控制与仓库有关的所有任务(存储产品,删除产品,获取库存等)。

最后是机器部分。 有3种类型的机器。 每种类型仅在生产的产品上有所不同。 1型和3型生产2型生产最终产品所需的原始产品。

为了创建尽可能多的机器,我决定使用Abstract Factory模式来实现它们。 这意味着我有一个abstractMachineFactory,其中包含所有需要的属性(例如机器ID,其状态(打开/关闭)等)和包括抽象方法“ produce(boolean status)”的方法。 Status = true表示机器正在生产,false表示机器没有生产。

我给每种机器类型都有自己的类,这样我就获得了ConcreteMachineType1,concreteMachineType2和concreteMachineType3。 在这里,“ produce()”方法专门针对机器类型实施,即类型2的方法(通过machineController)检查类型1和3所生产的原始产品的库存是否足够大,以便可以开始生产。 由于机器应不断生产,因此主体执行“ while(status = true)”。 如果库存不足,则机器将在一定的超时后(通过控制器)再次检查。

现在我们来看看machineController。 该控制器管理有关各个机器的所有任务。 这意味着创建它们,启动/停止一台或所有机器,从仓库中获取物料,将最终产品从临时存储区带到仓库等。

为了识别和访问我的机器,我实现了存储机器对象的不同阵列列表(每种机器类型一个),阵列的索引是机器的ID。 这样,我可以通过访问索引来启动/停止特定机器​​,或者通过解析整个数组列表来启动/停止所有机器。

在启动机器时,我还执行“ produce()”方法,这就是当前问题所在(我认为)。

这就是发生的情况:我创建了一些新机器(默认情况下它们已关闭),然后执行我的startAllMachines()方法。 此方法将执行的操作是解析数组列表,然后对该列表中的每个机器对象执行startMachine()。 如上所述,startMachine()也调用机器的produce()方法。

现在,我基本上处于一个无限循环中,因为只要将其状态值设置为false,该机器的produce()方法就会一直运行,直到我将其关闭。 这意味着将不会打开所有其他计算机,从而仅会产生该单台计算机,而其余机器将永远无法到达。

我认为我需要不同的线程来同时运行所有计算机,以便每台计算机由不同的线程启动。 问题是我对如何实现这一目标一无所知,而我发现的基本教程也无济于事。 他们中的大多数建议实现Runable()并定义一个run()方法,但这不适用于我的情况(恕我直言)。 我想我需要的是并发的机器启动器对象或其他东西。

我希望你们中的一些人可以给我一些提示,以提示您如何继续进行。

最好的问候daZza

class Machine {

private Thread producerThread;

/**
 * Non blocking method that produces fixed amount of stuff and returns.
 */
private void produceStuff() {
    // TODO
}

private void startProducing() {
    Runnable producingTask = new Runnable() {
        public void run() {

            produce();
        }
    };

    producerThread = new Thread(producingTask);

    producerThread.start();
}

private void stopProducing() {
    if (producerThread != null) {
        producerThread.interrupt();
    }

}

/**
 * Check cancellation every time stuff is produced.
 */
private void produce() {
    while (!Thread.currentThread().isInterrupted()) {
        produceStuff();
    }
}

public void start() {
    startProducing();
}

public void stop() {
    stopProducing();
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM