这个问题有点类似于Make an existing code in Java parallel/multithread
我没有找到特定于我的问题的答案,所以我在下面发布。
我正在尝试使现有的应用程序多线程化以减少执行时间。
这是我的(为简洁起见)简化版现有应用程序代码
for(MyClass myObject : myObjectSet) {
String outputString=myLongRunningMethod(myObject);
fileWriter.append(outputString+"\n");
}
fileWriter.close();
在这里,我试图使它成为多线程myLongRunningMethod
的。因为是最慢的部分。
ExecutorService threadExec = Executors.newFixedThreadPool(myObjectSet.size());
// 信号量实现 ResourcePool resourcePool = new ResourcePool(myObjectSet.size());
for(MyClass myObject:myObjectSet) {
Object key = resourcePool.getItem();
MyClassMT myClassMT = new MyClassMT(myObject);
threadExec.execute(myClassMT);
}
MyClassMT 在哪里:
public class MyClassMT implements Runnable{
MyClass myObject;
public MyClassMT(MyClass myObject) {
this.myObject=myObject
}
@Override
public void run() {
String outString= myLongRunningMethod(this.myObject);
System.out.println(outString);
}
}
问题/问题
我尝试的多线程代码似乎运行良好,因为我可以在控制台中看到预期的输出,但我无法更安全地myLongRunningMethod
使用fileWriter
. 此外,我可以在分析器中看到所有线程即使在完成处理后仍然处于活动状态myObject
处理完 myObjectSet 中的所有元素后,如何将输出写入文件。即以多线程方式取回我的原始功能。然后停止所有线程。
有没有更容易/更好的实现?也许涉及番石榴期货的那个 我真的需要使用类似于这里的代码的 MyResource Semaphore
顺便说一句,我尝试将其设置outString
为字段,MyClassMT
并尝试在 之后将其恢复到代码中threadExec.execute(myClassMT);
,但这不起作用。
代码中未显示,将为每个 myObjectSet 创建一个新的 fileWriter。
如果需要更多信息,请告诉我。