带有部分列表的Java多线程
我有一个名单,上面有1000条带有部分列表的Java多线程,java,multithreading,Java,Multithreading,我有一个名单,上面有1000条 public static List<Map<String,Object>> stockSymbolsListMap = new ArrayList<Map<String,Object>>(); public static List stocksymbolllistmap=new ArrayList(); 此列表包含我需要用于从exchange网站提取数据的股票符号。现在迭代并逐个执行是一个缓慢的过程。我想把这个
public static List<Map<String,Object>> stockSymbolsListMap = new ArrayList<Map<String,Object>>();
public static List stocksymbolllistmap=new ArrayList();
此列表包含我需要用于从exchange网站提取数据的股票符号。现在迭代并逐个执行是一个缓慢的过程。我想把这个列表分成100个部分,然后为每个部分生成一个单独的线程来获取结果。
此外,该过程将每秒重复一次
如何实现这一点?可以使用Guava将列表拆分为块,在每个线程中进行处理。使用java的完成服务和固定线程池,只需为列表中的每个元素提交一个可调用的。您可以通过更改线程池的大小来控制一次发生的线程数
完成服务的作用类似于队列/阻塞队列,因此您可以在答案准备就绪时轮询答案。这里有另一个解决方案,它不使用java.util以外的任何外部资源 而不是使用
public static List<Map<String,Object>> stockSymbolsListMap = new ArrayList<Map<String,Object>>();
或者干脆
import java.util.concurrent.*;
更新
您可能还希望根据以下链接应在其中使用的可用线程数量来缩放创建的线程数量 尝试使用java线程编写多线程代码。并张贴你遇到的问题。请查找多线程教程,或者您可以浏览好的多线程教程。我的主要问题是如何计算列表部分?最好是将索引拆分为相同大小并使用它们。对于多线程,我使用Java的executor服务和固定线程池。您可能会发现在这里使用
ForkJoinPool
非常合适。关于它有一篇很棒的文章。
for(int i = 0; i < 450; i++){
eh.add(new bleh());
}
int listAmount;
if(eh.size()%BLOCK_SIZE != 0)
listAmount = eh.size()/BLOCK_SIZE + 1;
else
listAmount = eh.size()/BLOCK_SIZE;
List<bleh>[] lists = new List[listAmount];
for(int i = 1; i <= listAmount; i++){
if(i * BLOCK_SIZE < eh.size()){
lists[i - 1] = eh.subList( (i - 1) * BLOCK_SIZE, eh.size());
}
else{
lists[i - 1] = eh.subList( (i - 1) * BLOCK_SIZE, i * BLOCK_SIZE);
}
}
ExecutorService executor = Executors.newCachedThreadPool();
for(List<bleh> list : lists){
executor.execute(new MyThread(list));
}
private static class MyThread implements Runnable{
private List<bleh> eh = null;
public MyThread(List<bleh> list){
eh = list;
}
@Override
public void run(){
System.out.println("SOME THREAD");
for(bleh meh : eh){
System.out.print(meh.toString());
}
}
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.*;