我在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.
我正在考虑如何实现这一点。 能否帮助我解决这个问题,并就需要进行的设计变更提出建议和反馈。
由于 Vikeng
答案 0 :(得分: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);
}
});
}
答案 1 :(得分:0)
在进行更改之前,请确保多个线程有所帮助。运行该方法,您可以检查CPU和磁盘I / O活动。还要检查是否有垃圾收集。
如果存在任何这些条件,那么添加线程确实无济于事。您必须解决该特定条件才能获得任何吞吐量改进。
说过使代码线程安全的技巧是在类中没有用于在方法执行期间保持状态的任何实例变量。对于每个现有的实例变量,您需要决定是否将其作为在方法或方法参数中声明的局部变量。