繁体   English   中英

java应用程序多线程设计与优化

[英]java application multi-threading design and optimization

我设计了一个Java应用程序。 一位朋友建议使用多线程,他声称以多个线程运行我的应用程序将大大减少运行时间。

在我的主类中,我进行了一些超出我们范围的操作,以填充全局静态变量和哈希映射,以在流程的整个生命周期内使用。 然后,我在数组列表的条目上运行应用程序的核心。

        for(int customerID : customers){
        ConsumerPrinter consumerPrinter = new ConsumerPrinter();
        consumerPrinter.runPE(docsPath,outputPath,customerID);
        System.out.println("Customer with CustomerID:"+customerID+" Done");
    }

对于此循环的每次迭代,从计算机中获取给定客户的XML,进行解析,并对解析后的数据进行计算。 之后,将处理后的结果写入一个文本文件中(读取和写入的数据最多可以达到几个Giga字节,平均可以达到50 MB)。 可以在同一个文件上进行多个迭代。

我是否应该使这段代码为多线程,以便将每组客户都置于一个独立的线程中?

我如何知道要运行的最佳线程数?

实施多线程时应考虑哪些最佳实践?

Should I make this piece of code multi-threaded so each group of customers are taken
in an independent thread?

是的,多线程将节省您的处理时间。 在列表上进行迭代时,您可以在每次迭代中生成新线程并在其中进行客户处理。 但是,您需要进行适当的同步,这意味着如果两个客户处理需要在同一资源上进行操作,则必须同步该操作以避免可能的竞争条件或内存不一致问题。

How can I know the most optimal number of threads to run?

您不能真正地不实际分析具有不同线程数的n个客户的处理时间。 这将取决于您的处理器拥有的内核数量,以及每个客户实际进行的处理是什么。

What are the best practices to take into consideration when implementing multi-threading?

首先,最重要的标准是您必须具有多个内核,并且您的操作系统必须支持多线程。 目前几乎每个系统都可以执行此操作,但这是一个值得研究的良好标准。 其次,您必须分析所有可能导致race condition 您知道将在多个线程之间共享的所有资源必须是thread-safe 另外,您还必须注意memory inconsistency issues可能性(将变量声明为volatile )。 最后,在实际运行测试用例(如deadlocks (需要分析线程转储)或memory leaks (需要分析堆转储))之前,有些东西是无法预测或分析的。

多线程的想法是将一些繁重的过程变成另一个,例如……“内存块”。

任何UI更新都必须在主线程/默认线程上完成,例如,打印消息或使视图膨胀。 您可以要求该应用程序绘制位图,从互联网上下载图像或繁重的验证/循环块以在单独的线程上运行它们,想象您正在创建第二个短寿命应用程序来为您处理这些任务。

请记住,您可以要求应用程序在另一个线程上下载/绘制图像,但是您必须将此图像打印在主线程的屏幕上。

通常用于在单独的线程上加载较大的位图,进行数学计算以调整该大图像的大小,然后在主线程上向用户充气/打印/绘制/显示该图像的较小版本。

在您的情况下,我不知道runPE()方法有多繁重,我不知道它的作用,您可以尝试为他创建另一个线程,但是其余的应该在主线程上,这是主要的用户界面的过程。

您可以通过放置“ ConsumerPrinter ConsumerPrinter = new ConsumerPrinter();”来优化循环。 在“ for(...)”之前,由于它不会发生明显变化,因此您可以在循环内部将其删除,以避免每次循环重新启动时都创建相同的对象:)

尽管可以使用直接Java多线程( java.util.concurrent )来讨论其他答案,但也可以考虑使用多线程的替代编程方法,例如actor模型 actor模型仍然在下面使用线程,但是很多复杂性是由actor框架而不是程序员直接处理的。 另外,由于创建使用actor模型的程序的方式,很少有(或没有)理由需要在线程之间共享状态上进行同步。

请参阅Java的哪个Actor模型库/框架? 讨论流行的演员模型库。

暂无
暂无

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

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