我正在使用java并使用Zephyr的api进行休息。我不认为使用的api会影响我的问题的可能性。我只是想知道是否有可能使用多线程同时进行多次相同的休息调用?每个调用都将检索不同的数据,它们并不都是抓取相同的数据。
这仅仅是为了检索数据,而不是写作。
如果可能,有什么风险?这是推荐的吗?
答案 0 :(得分:5)
当然,如果以正确的方式实施,它将改善您的表现。如上所述,您只需要小心实现以避免安全性和性能问题。我建议有一个线程池,这样你就可以管理许多正在执行你同时进行的REST调用的线程。
ThreadPoolExecutor
会有所帮助。
您可以使用Executors.newFixedThreadPool
/ Executors.newCachedThreadPool
。它们都很好。
您可以创建一个任务(实现Callable
)来执行您的REST调用或调用,然后使用invokeAll(
ThreadPoolExecutor
(您希望包含以下列表:这里的任务)。
希望它对你有所帮助。
最好的问候。
答案 1 :(得分:1)
有可能。请注意您调用它的次数,因为根据服务器参数,您将超出服务器的会话限制。此外,如果你用很多线程快速调用它,你可能会得到一些看似拒绝服务攻击的东西。
答案 2 :(得分:1)
是的,你可以这样做。即使写数据也不是问题。唯一的风险是您可能会更快地使数据连接过载,或者您的服务器可能不允许这样做。其他风险是严重执行多线程所固有的。
答案 3 :(得分:1)
正如其他人所指出的那样,是的,这是可行的,但你应该知道你可能会在服务器上加载。
我过去用于此类事情的一种解决方案是一种或另一种工作队列。例如:
ExecutorService es = Executors.newFixedThreadPool(MAX_THREADS);
for (final Thing thing : things) {
es.submit(new Runnable {
@Override
void run() {
doSomething(thing);
}
});
}
es.shutdown();
这是做什么的:
Executors.newFixedThreadPool(int)
创建一个新的ExecutorService
,可并行处理最多MAX_THREADS
个任务。Runnable
类来为每个类调用doSomething(thing)
。在这里,您可以拨打服务器并执行您必须执行的任何工作。ExecutorService.shutdown()
告诉ExecutorService
我们已完成了要做的事情。如果您想等待所有这些任务完成,请参阅ExecutorService#awaitTermination(long, TimeUnit)
另请参阅:Thread Pools