我在我的Java应用程序中使用线程来并行获取数据(使用网络调用).我有一个方法(不在线程类中),它创建一个给定大小(最大10-15)的线程池并将它们用于网络调用,我从循环中多次调用该方法.
当我在慢速机器(3 GB RAM,Pentium-IV)上运行此应用程序时,一切正常,但是当我在iMac(32 GB RAM,i7处理器)上运行它时,它创建了太多线程,大约2,500个有时会抛出一个内存不足的错误.
我怀疑JVM在完成后不会将完成的线程重新放回池中,因此它正在创建新线程.
甚至在iMac上,如果我保留Thread.sleep(1000); 在for
我上面提到的循环中一切正常.虽然创建了大约900个线程.
以下是此应用程序的代码示例:
public ArrayList<String> getValuesForKeyFromMaps(String key, ArrayList<Meta> locations) throws InterruptedException, ExecutionException {
int threadNum = locations.size(); // 10-15 at max
ExecutorService executor = Executors.newFixedThreadPool(threadNum);
List<FutureTask<ArrayList<String>>> taskList = new ArrayList<FutureTask<ArrayList<String>>>();
for(final Meta location : locations){
FutureTask<ArrayList<String>> futureTask_1 = new FutureTask<ArrayList<String>>(new Callable<ArrayList<String>>() {
public ArrayList<String> call() throws Exception {
// Service call
return getValues(key, location);
}
});
taskList.add(futureTask_1);
executor.execute(futureTask_1);
}
ArrayList<String> values = new ArrayList<String>();
// Wait until all results …
Run Code Online (Sandbox Code Playgroud) java multithreading out-of-memory executorservice java-threads
我在 MySQL 中有一个表,其中有一个字段“class_id”。我需要编写一个查询,返回使用 IN 子句列表中的每个值按降序时间顺序排序的前 15 行。
查询解释:
select * from table_x where class_id IN (1,2,3) sort by time_x desc limit 15;
Run Code Online (Sandbox Code Playgroud)
在上面的示例查询中,我需要获取按降序时间顺序排序的每个 class_id(1,2 和 3)的前 15 行。