0

ファイルにアクセスするために大きなファイルシステムにアクセスしているJavaのユーティリティクラスがあります。一部のファイルは巨大であるため、Utilityクラスがこれらのファイルにアクセスするために多くの時間を費やしており、ここでパフォーマンスの問題に直面しています。パフォーマンスを向上させるためにマルチスレッドを実装する予定ですが、それをどのように行う必要があるかについて少し混乱しています。以下は Utility クラスの構造です。

public class Utility {

     public static void Method1(ArrayList values){
          //do some processing
          for(int i=0; i< values.size();i++){
             ArrayList<String> details= MethodAccessFileSystem();

             CreateFileInDir(details);
        } 
     }
     public ArrayList<String> MethodAccessFileSystem(){
        //Code to access the file system. This is taking hell lot of time.
     }
     public void CreateFileInDir(ArrayList<String> values){
       //Do some processing here. 
     }
}

次の構文を使用して、スタンドアロン クラスでこの Utilty クラスを呼び出していました。

       Utility.Method1(values); //values is an ArayList.

ここで、上記のコードをマルチスレッド コードに変換する必要があります。Thread クラスを拡張するか、Runnable を実装してスレッドを作成する方法を知っています。私はそれについて基本的な考えを持っています。

しかし、私が知る必要があるのは、この Utilty クラス全体を変換して Runnable を実装する必要があるということです。または、Utilty クラスの一部を分離して Runnable タスクにする必要があります。これらのメソッドはループで呼び出されるため、私の問題は for() ループにあります。MethodAccessFileSystem() を分離してタスクとして作成すると、これが機能します。MethodAccessFileSystem() に時間がかかる場合、Threadpoolexecutor を使用して固定数のスレッドをスケジュールすると、JVM は自動的に別のスレッドを開始します。このメソッドを一時停止する必要があるか、必要でないか、JVM が処理します。主な問題は、For ループにあります。

最後に必要なのは、Utility クラスがマルチスレッドであり、メソッドの呼び出しが上記と同じであることです。

     Utility.Method1(values); //values is an ArayList.

どのように実装できるかを考えています。これについて私を助けて、必要な設計変更に関する提案とフィードバックを提供してください.

ありがとう

4

2 に答える 2