終了したスレッドを返す Java 印刷結果でマルチスレッド プログラムを作成しようとしています。問題は、このコードを実行すると、キューにあった 2 番目の値でスタックすることです。
System.out.println("[!] Creaing pool");
int max_threads = 50;
ExecutorService threadPool = Executors.newFixedThreadPool(max_threads);
CompletionService<String> taskCompletionService =
new ExecutorCompletionService<String>(threadPool);
String url;
while(our_file.hasNext()){
url = our_file.next();
if (url.length()>0){
futures.add(
taskCompletionService.submit(
new GoGo(url)
)
);
}
int total_tasks = futures.size();
while(total_tasks>0){
for (int i=0; i<futures.size(); i++){
try{
Future result = taskCompletionService.poll();
if(result!=null && result.isDone()){
System.out.println(result.get());
total_tasks--;
}
}
catch (InterruptedException e) {
// Something went wrong with a task submitted
System.out.println("Error Interrupted exception");
e.printStackTrace();
} catch (ExecutionException e) {
// Something went wrong with the result
e.printStackTrace();
System.out.println("Error get() threw exception");
}
}
}
}
threadPool.shutdown();
try {
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
}
catch (InterruptedException e ) {
}
...
class GoGo implements Callable{
private String url;
public GoGo(String received_url){
this.url = received_url;
}
public String call(){
String URL = this.url;
return url;
}
}
出力は次のようになります。
[!] Creaing pool
http://www.www1.com/
http://www.www2.ch/
この時点で、プログラムは動かなくなります。スレッドを送信するメイン ループから先物配列を反復処理するループを移動しようとしましたが、正常に機能しましたが、非常に大きなファイルを処理する場合に備えて、リアルタイムの出力が必要です。CompletionService のノンブロッキング poll() メソッドを使用する適切なコードが見つかりませんでした。回答または参考にしていただきありがとうございます。