Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中对象的并发性_Java_Multithreading_Concurrency_Worker - Fatal编程技术网

Java中对象的并发性

Java中对象的并发性,java,multithreading,concurrency,worker,Java,Multithreading,Concurrency,Worker,我目前正在做一个练习,在这个练习中我必须用Java设计一个小而简单的工业工厂。基本上,我有一个用于存储的仓库,生产物品的机器和一个接受命令并通知用户当前不同产品库存的GUI,等等 然而,我几乎所有的东西都在工作,但现在一次只能生产一台机器。这可能是因为我对整个练习的态度。我想从一个很小的程序开始,只需编写可以独立工作的微小单元,然后将它们一个接一个地拼凑在一起,为应用程序添加越来越多的逻辑,实现不同类之间的所有通信,等等 现在,我已经到了一切似乎都很好的地步,唯一要做的就是建立并发性,这样我就可

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

然而,我几乎所有的东西都在工作,但现在一次只能生产一台机器。这可能是因为我对整个练习的态度。我想从一个很小的程序开始,只需编写可以独立工作的微小单元,然后将它们一个接一个地拼凑在一起,为应用程序添加越来越多的逻辑,实现不同类之间的所有通信,等等

现在,我已经到了一切似乎都很好的地步,唯一要做的就是建立并发性,这样我就可以同时运行多台机器而不会出现任何问题

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

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

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

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

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

我给了每种机器类型自己的类,所以我得到了concreteMachineType1、concreteMachineType2和concreteMachineType3。其中“product()”方法专门针对机器类型实施,即type2的方法检查(通过machineController)type1和Type3生产的原产品是否有足够的库存,以便开始生产。 由于机器应该持续生产,主体执行“while(status=true)”。如果料堆不够大,机器将在特定超时后(通过控制器)再次检查

现在我们来谈谈机器控制器。该控制器管理与单个机器有关的所有任务。这意味着创建它们,启动/停止一台或所有机器,从仓库获取供应,将最终产品从临时仓库带到仓库,等等

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

当启动机器时,我也执行“product()”方法,这就是问题所在(在我看来)

事情是这样的:我创建了一些新机器(默认情况下它们是关闭的),然后执行startAllMachines()方法。此方法将通过数组列表进行解析,并对该列表中的每个机器对象执行startMachine()。如上所述,startMachine()还调用机器的product()方法

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

我想我需要不同的线程来同时工作所有的机器,所以每台机器都是由不同的线程启动的。问题是我不知道如何实现这一点,我找到的基本教程也帮不了我。大多数人建议实现Runable()并定义run()方法,但这不适用于我的场景(imho)。我想我需要的是并发机器启动器对象或其他东西

我希望你们中的一些人能给我一些关于如何在这里进行的提示

致意 达扎

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

}

这本书有很多内容要读。确实如此,但我想尝试简要概述一下整个概念,以便您理解我为什么需要我需要的东西。此外,从我在这个平台上收集的信息来看,人们通常会欣赏细节/概念,并且在您能够提供这些细节/概念时,他们更有可能帮助您。我不想让任何人帮我做“家庭作业”,我已经完成了大部分(足够令人惊讶:P),我只想得到一些关于如何解决最后一个问题的提示,因为并发性似乎是编码世界中更复杂的主题之一。谢谢,伙计。明天第一件事就是设法实施它。