【问题标题】:Alternative Suggestions for MultiThreading多线程的替代建议
【发布时间】:2017-08-17 14:07:35
【问题描述】:

我正在使用多线程 ExecutorService 接口来并行执行任务。但是这里有一个共享资源,我需要将它放在同步块中,以便一次只有一个线程可以访问它。正如我在同步块中所做的那样,这项工作大约需要 3 个多小时才能完成。由于同步块,我在这里看不到使用多线程的任何意义。任何人都可以建议是否有任何替代方法或最佳方法来实现以下示例以更快地并行运行循环:

ExecutorService executor = Executors.newFixedThreadPool(100);
for(String str : arrayList){
   for(String str1 : arrayList1){
     for(String str2 : arrayList2){
        executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            //do Something
                            synchornize block{}
                        }
        });
     }
   }
}

有什么建议吗?

【问题讨论】:

  • 我不知道是谁否定了这个问题,但请你告诉我原因吗?这样我就不在这里重复了?
  • 不是我,但我认为答案完全取决于执行程序块中的代码。出于好奇,单线程需要多长时间?
  • 所以基本上我们将在嵌套的 for 循环中进行 API 调用。所以你的意思是问我是否用一个线程而不是 100 个线程来运行它?我相信我从来没有测试过它。但如果它的 100 个线程需要大约 3 小时。实际上,即使使用单线程也可能需要 3 小时,因为其中大部分都有一个同步块。 @史蒂夫史密斯
  • 如果是这种情况,那么我将发布另一个问题,即“如何减少此代码所需的同步”,并发布您的 synchornize block [原文如此] 代码。事实上,多线程没有任何区别。
  • 您需要一个可靠的架构来解决您的问题,但不要具体说明您的问题。对于这么少的信息,我们无法为您提供帮助。

标签: java multithreading executorservice


【解决方案1】:

您应该尝试重新设计代码以完全避免或最小化同步块。例如,您可以将 API 调用的结果放在同步队列中,并让另一个线程处理它们。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多