将总执行时间减少到最小的最佳解决方案(程序操作输入和输出数据)

时间:2015-10-25 14:03:53

标签: java multithreading multiprocessing blockingqueue

我有使用4个输入.txt文件的程序。程序启动时,完成某些数据操作,从这4个文件中获取数据,程序最后创建2个输出.txt文件。那时的程序执行时间约为18秒。我想知道在程序执行方面编写这个程序的最快方法是什么?这就是现在编写程序的方式:

  1. 首先,我开始按顺序读取和写入数据,因此我的程序逻辑基于2个部分 - 一个循环(用于读取必要的数据和文件创建)用于第一个输出文件,另一个循环(也是用于读取必要数据和该文件的文件创建)用于第二个输出文件。 使用这种方法需要等待第一种方法完成的第二种方法。 我的执行总时间约为18秒。

  2. 然后,我参与了theads - 我使用了2个threadsm(一个线程运行它的循环),所以每个循环都将在不同的线程中运行。 通过这种方法,我将总执行时间缩短到大约9秒。

  3. 现在;我开始问我是否可以加快执行的总时间?

  4. 第一个线程的代码看起来像这样(其他线程的代码基本上或多或少相似):

    Thread thread1 = new Thread() {
        public void run() {
    
            final List<Articles> article_list = ac.getFileValues("resources/articles.txt");
    
            String file_contents = "";
            String file1_data = "";
            for (int i = 0; i < article_list.size(); i++) {
    
                double price_art_local_val = cc.getPrice("resources/pricelist.txt", article_list.get(i).sifra);
                double[] art_all_shops = sc.getAmountInAllStores("resources/supply.txt", article_list.get(i).sifra);
    
                double total_value_art_all_shops_local = price_art_local_val * art_all_shops[0];
                double total_value_art_all_shops_foregin = total_value_art_all_shops_local / exchange_rate;
    
                file_contents = article_list.get(i).sifra+"\t"+article_list.get(i).naziv+"\t"+df.format(price_art_local_val)+"\t"+df.format(art_all_shops[0])+"\t"+article_list.get(i).jedinica_mjere+"\t"+df.format(total_value_art_all_shops_local)+"\t"+df.format(total_value_art_all_shops_foregin)+"\t"+df.format(art_all_shops[1])+"\n";
    
                System.out.print(file_contents);
                file1_data += file_contents;
            }
    
            if(file1_data != "")
            {
                save.saveFile("results/supply_value_articles.txt", file1_data);
            }
        }
    };
    

    在我看来,我认为进一步减少执行时间的地方是在那段代码中的方法cc.getPrice和sc.getAmountInAllStores()我的观点是,实现它们在不同的线程中运行会很好,因此其他方法不必等待第一个方法的执行。我是否走得很好?

    所以我假设如果我想加速for循环中的执行,我需要在单独的线程中执行方法cc.getPrice()和sc.getAmountInAllStores()。如果这不是正确的解决方案,我想知道该怎么做。

    然后,如果这是正确的解决方案,我该如何实现?我不知道如何正确编写代码以使用另一个线程,如果该代码已经在run()方法中。它可以做甚至,我不确定?此外,该方法返回某些值,并且它们需要存储在变量中。所以我还需要获取存储的元数据的数据;意思是线程会为我返回数据。我不知道如何正确地做到这一点。看起来像这样对我来说基本上没有帮助我写这个(如果我为方法cc.getPrice创建一个线程,为方法sc.getAmountInAllStores创建另一个线程并将它们命名为thread3和thread4):

    thread3.join();
    thread4.join();
    

    我需要一段显示相应解决方案的代码。 如果我没有走上正轨,并且无法完成(在运行线程中启动和使用新线程),请指导我该做什么。我已经阅读了一些stackowerflow问题BlockingQuene,但我认为我的方法带来了我需要的其他东西。

    如果可以,请帮助解释代码示例。非常感谢,非常感谢。

0 个答案:

没有答案