小编Sud*_*eer的帖子

在Java中创建太多线程

我在我的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

6
推荐指数
1
解决办法
4412
查看次数

Mysql 查询带有 IN 子句和每个项目的限制

我在 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 行。

mysql limit in-clause

5
推荐指数
1
解决办法
2250
查看次数