- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Java ExecutorService 框架允许您使用托管线程池委派许多要执行的任务,这样 N 个任务就可以一次执行 X 个任务,直到完成。
我的问题是......如果 N 是一个无穷大的数字或者大到最初分配/分配/定义不切实际怎么办。
如何利用 Java (ExecutorService) 中的线程池概念来处理比合理提交的任务更多的任务,而不会耗尽资源。
为了这个答案的目的,假设每个任务都是独立的,不依赖于任何其他任务,并且任务可以按任意顺序完成。
我最初尝试解决这个问题涉及一次为 ExecutorService Y 线程提供数据,但我很快意识到没有明显的方法来判断特定任务何时完成并因此提交一个新任务来执行。
我知道我可以编写自己的“ExecutorService”,但我正在尝试利用 Java 框架已经提供的资源。我通常属于“不要重新发明轮子”的类别,因为比我更聪明的人已经为我投资了。
提前感谢任何可以提供有关如何解决此类问题的任何见解的人。
最佳答案
您可以使用 CompletionService
来完成它。您可以让一个线程为服务播种一堆任务,然后当任务完成时您可以添加新任务。
一个简单的例子:
final CompletionService service = new ExecutorCompletionService(Executors.newFixedThreadPool(5));
Runnable taskGenerator = new Runnable() {
public void run() {
// Seed the service
for (int i = 0; i < 100; ++i) {
service.submit(createNewTask());
}
// As tasks complete create new ones
while (true) {
Future<Something> result = service.take();
processResult(result.get());
service.submit(createNewTask());
}
}
};
new Thread(taskGenerator).start();
这使用一个 ThreadPoolExecutor
,它有 5 个线程来处理任务,还有一个手动生成的生产者/消费者线程来生成任务和处理结果。
显然,您需要比 while (true)
更聪明的东西,您需要合理地实现 processResult
和 createNewTask
,这假设任务执行比生成它们或处理结果要慢得多。
希望这能让您走上正轨。
关于java - 如何将 Java ExecutorService 线程池用于正在进行的/无限的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13783531/
我是一名优秀的程序员,十分优秀!