マシンのすべてのコアを実際に利用していないように見えるマルチスレッド プログラムがあります。これがコードであり、どんな入力も高く評価されます。
メインクラス
public class MainClass{
public static void main(String [] args){
Work work=new Work();
work.doIt();
}
}
2 番目のクラスはタスクを作成し、それらを ExecutorService に渡します。ここに擬似コードを示します。
public class Work{
public void doIt() throws InterrputedException, Exception{
map=get some data and put it in the map;
ArrayList<Future<Integer>> list=new ArrayList<Future<Integer>>();
ArrayList<WorkCallable>jobs=new ArrayList<WorkCallable>();
for each entry in the map;
jobs.add(new WorkCallable(entry);
int numCores=Runtime.getRuntime().availableProcessors();
ExecutorService executor=Executors.newFixedThreadPool(numCores);
int size=jobs.size();
for(int i=0;i<size;i++){
Callable<Integer> worker=jobs.get(i);
Future<Integer> submit=executor.submit(worker);
list.add(submit);
}
executor.shutdown();
while(!executor.isTerminated()) {}
do something with the returned data;
}
}
Callable クラス
public class WorkCallable implements Callable<Integer>{
@Override
public Integer call() throws Exception{
Properties props=new Properties();
props.put("annotators", "tokenize, ssplit, pos");
StanfordCoreNLP pipeline=new StanfordCoreNLP(props);
for(String id:entry.keySet()){
Annotation document=new Annotation(entry.get(id));
pipeline.annotate(document);
process the data;
return an integer value;
}
}
問題は、実行中のスレッドの数を確認したところ、ごくわずかしか見つからず、エグゼキュータが理想的なコアを利用していないように見えることです!
説明が明確であることを願っています。
更新:
- 使用されるライブラリは、StanfordCoreNLP パッケージで、Callable オブジェクトに渡されたテキストを documentID とそのコンテンツのマップとして処理します。StanfordCoreNLP ライブラリを含めなくても問題なく動作しているため、データの処理は問題ではありません。言い換えれば、ドキュメントの浅い処理はうまく機能し、すべてのコアを利用します。しかし、このパッケージを含めると、そうではありません。