我可以使用多线程一次多次进行相同的休息呼叫吗?

时间:2015-04-17 20:31:40

标签: java multithreading rest

我正在使用java并使用Zephyr的api进行休息。我不认为使用的api会影响我的问题的可能性。我只是想知道是否有可能使用多线程同时进行多次相同的休息调用?每个调用都将检索不同的数据,它们并不都是抓取相同的数据。

这仅仅是为了检索数据,而不是写作。

如果可能,有什么风险?这是推荐的吗?

4 个答案:

答案 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();

这是做什么的:

  1. 使用Executors.newFixedThreadPool(int)创建一个新的ExecutorService,可并行处理最多MAX_THREADS个任务。
  2. 迭代一些"事物"继续工作(无论那些是依赖于域的),并创建一个新的匿名Runnable类来为每个类调用doSomething(thing)。在这里,您可以拨打服务器并执行您必须执行的任何工作。
  3. 致电ExecutorService.shutdown()告诉ExecutorService我们已完成了要做的事情。如果您想等待所有这些任务完成,请参阅ExecutorService#awaitTermination(long, TimeUnit)
  4. 另请参阅:Thread Pools