java - 我应该如何设计这个程序?

标签 java multithreading java-8

<分区>

我正在用 Java 编写程序。图片是不言自明的-

Design main 方法生成三个线程。 SAX 处理器处理输入的 XML 文件,生成 JAXB 对象并将它们放入 guava 缓存中。 Guava 缓存由另一个线程处理。每当任何对象进入缓存时,该线程都会通知第三个线程,即 MDL 生成器(它关联相似的 JAXB 对象,将它们互连并生成另一个 XML 文件,称为 MDL)。我已经为主类编写了以下代码-

package test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainClass {

    public static void main(String args[]) {

        ExecutorService xMLService = Executors.newFixedThreadPool(1);
        xMLService.execute(new XMLProcessor());

        ExecutorService cacheService = Executors.newFixedThreadPool(1);
        cacheService.execute(new CacheProcessor());

        ExecutorService mdlService = Executors.newFixedThreadPool(1);
        mdlService.execute(new MDLProcessor());

        xMLService.shutdown();
        cacheService.shutdown();
        mDLService.shutdown();
    }
}

但现在我对如何在线程之间传递对象以及每当有新对象进入缓存时如何通知 MDL 生成器感到疑惑。在 Java 旧线程模型中,我们可以使用 notify(),但我想使用当前的 ExecutorService。还有异步回调。所以我想知道如何设计这个框架。如何传递对象并通知线程?我们将缓存对象保存在 HashMap 中,CacheService 线程需要将 key 传递给 MDLService。那么我应该使用哪种模式呢?

最佳答案

How to pass objects and notify the threads? We are keeping the cache objects in HashMap and the CacheService thread needs to pass the key to the MDLService. So which pattern should I use?

在我看来,您的线程太多了。 XML 读取线程和 MDL 写入是有道理的,但是仅仅将东西放入内存缓存中的线程似乎太复杂了。如果 MDL 生成器需要使用 Guava 缓存,那么它应该“拥有”缓存并将内容放入其中。

剩下 1 个输入 SAX 处理器线程和一个输出 MDL 生成器线程。好的。要连接这两者,我会使用 BlockingQueue,例如 LinkedBlockingQueue。您可能希望也可能不希望对队列设置大小限制,具体取决于读取速度是否快于写入速度以及作业中的记录数。

因此您的主线程将创建 BlockingQueue,然后将其传递给输入和输出线程。 SAX 输入线程调用队列上的 put(),MDL 输出线程调用 take() 将对象放入 Guava 缓存,然后进行 MDL 生成。

希望这对您有所帮助。

关于java - 我应该如何设计这个程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54826014/

相关文章:

c++ - 在 C++ 中将数据从一个线程发送到另一个线程的最快方法是什么?

java - 将 Java-8 Stream 收集到 Guava ImmutableList 的最佳方式

java - Apache Flink fromCollection java.lang.IllegalStateException : unread block data

java - HandlerThread 的线程 ID - android

multithreading - TThread.Synchronize 是邪恶的/死产的吗?

java - jdbcTemplate setQueryTimeout 值类型

Java HttpsURLConnection 在没有 setSSLSocketFactory 设置的情况下成功执行

java - 使用 Java 的平均计算器程序

java - 为什么有两个 "new Intent"?他们会做出两个不同的 Intent 吗?

java - <?扩展类> 和 <? Java 中的 super Class> - 为什么它会这样工作?