gpt4 book ai didi

java - 多线程程序中完成线程的实时输出(CompletionService)

转载 作者:行者123 更新时间:2023-12-01 13:56:04 26 4
gpt4 key购买 nike

我尝试在 Java 上制作多线程程序,打印返回已完成线程的结果。问题是,当我运行此代码时,它只是卡在队列中的第二个值上:

        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/

此时程序就卡住了。我尝试将迭代 futures 数组的循环移出提交线程的主循环,并且工作正常,但如果我要处理非常大的文件,我需要实时输出。请帮我找出瓶颈在哪里,我无法找到任何合适的使用 CompletionService 中的非阻塞 poll() 方法的代码。感谢您的回答或引用。

最佳答案

问题是您试图在一个线程中同时做两件事(提交工作和读取工作结果)。

这没有意义 - 对于并发任务,您需要多个线程。

因此创建另一个线程来读取结果。或者另一个线程来提交任务。不管你用哪种方式来做,都没关系。无论哪种方式,您最终都会得到 2 个线程,而不是一个。

关于java - 多线程程序中完成线程的实时输出(CompletionService),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19619617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com