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

0

从你的班级根据我的chunk of work which fits in Parallelism principle is below loop.

// do some processing
    for (int i = 0; i < values.size(); i++) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                ArrayList<String> details = MethodAccessFileSystem();
                CreateFileInDir(details);
            }
        });

    }
于 2012-09-06T19:38:12.097 回答
0

在进行更改之前,请确保多个线程会有所帮助。运行该方法,您可以检查 CPU 和磁盘 i/o 活动。还要检查是否正在进行任何垃圾收集。

如果存在任何这些条件,那么添加线程真的无济于事。您必须解决该特定条件才能获得任何吞吐量改进。

话虽如此,使代码线程安全的技巧是在类上没有任何用于在方法执行期间保持状态的实例变量。对于每个现有的实例变量,您需要决定是使其成为方法中声明的局部变量还是方法参数。

于 2012-09-06T19:38:59.110 回答