java - Java对象的并发

标签 java multithreading concurrency worker

我目前正在做一个练习,我必须在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()”方法专门针对机器类型实施,即,type2的方法(通过machineController)检查类型1和3生产的原始产品的库存是否足够大,以便可以开始生产。
由于机器应不断生产,因此主体执行“ while(status = true)”。如果库存不足,则机器将在一定的超时后(通过控制器)再次检查。

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

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

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

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

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

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

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

最好的祝福
大扎

最佳答案

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();
}


}

关于java - Java对象的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533731/

相关文章:

java - 更新 jlabel

Python threading.join() 挂起

java - Java密码和socket流的三个问题

java - 获取2个随机数的平均值 "30"

java - Inflater 找不到布局 - Android

multithreading - Perl线程获得迭代速度

multithreading - 如何启动和停止工作线程

Python -> 复制目录,而另一个进程从中删除/添加文件

java - 避免使用 volatile 修复

java - 为十六进制和八进制 int 文字禁用 intellij "unnecessary boxing"