如何使用java并发读取数据?

如何使用java并发读取数据?,java,multithreading,concurrency,java.util.concurrent,Java,Multithreading,Concurrency,Java.util.concurrent,我有一个方法,它将字符串作为输入,并根据输入字符串从数据库返回数据。我有一个字符串数组,当前我将每个字符串作为输入传递,并在整个数组上循环 public DataClass getData(String input){ ....logic to get the data when string=input from a third party API. Third party API takes 'input' string and gives out data.... }

我有一个方法,它将字符串作为输入,并根据输入字符串从数据库返回数据。我有一个字符串数组,当前我将每个字符串作为输入传递,并在整个数组上循环

public DataClass getData(String input){
  ....logic to get the data when string=input from a third party API. 
       Third party API takes 'input' string and gives out data....
}

public void callerMethod() {
  List<String> myStrings = new List<String>();
  for(inputStr : myStrings) {
       DataClass data = getData(inputStr);
  }
}
公共数据类getData(字符串输入){ ..当字符串=来自第三方API的输入时获取数据的逻辑。 第三方API获取“输入”字符串并给出数据。。。。 } public void callerMethod(){ List myStrings=new List(); for(inputStr:myStrings){ DataClass data=getData(inputStr); } }
上面的代码是我现在拥有的逻辑。我想将getData()方法调用更改为并发调用,而不是一个接一个地遍历列表,因为这种方法需要时间。我不确定我是否可以在这里使用线程,或者是否有更新的方法来实现这一点。

这可以使用Executor框架进行并行化。创建一个线程池执行器。线程的数量可能应该等于您可以与数据库进行的并发连接的数量(即连接池大小)


循环你的字符串。对于每个字符串,创建一个包装getData的Callable,并将Callable提交给执行器。执行者将返回一个您以后可以使用的未来。一旦您提交了所有可调用项,就可以开始从未来检索数据类。

如果您是从数据库读取数据,我可以保证您是IO绑定的。在单个通道上并行IO不会有帮助。您应该考虑将过滤逻辑移动到DB查询中。尽管我有其他类似的DB IO区域,但在当前情况下,我正在对第三方API进行API调用。编辑问题以包含以下内容info@millimoose你能?在很多情况下,您可以基于字符串执行CPU绑定的操作,或者执行其他IO绑定的任务。无论如何,我的第一种方法是(或
invokeAll()
)并从返回的
未来
获取数据。这是假设第三方API可以以线程安全的方式使用。@user811433如果您使用的是C#,那么它将是并行的。。在所有这些方面,Java 8为您提供了与新streams API类似的接口。不幸的是,在Java 7中,您需要两个实现Runnable的类,一个用于worker(从ConcurrentLinkedQueue中使用)(有8个这样的或任意数量的内核),另一个用于DB生产者,该生产者接收DB并为其生成。如果你想要更多的东西,millimoose关于期货的建议可能是一个更好的方法。它应该返回值吗?@user811433,future.get()将返回与callable.call()相同的内容。区别在于,如果您自己调用call(),它将立即执行。但是,如果您将callable提交给执行者,则将来可能会调用它。未来允许您获取延迟调用的值。如果该值还不可用,它将阻塞,直到它可用为止。