优化:在循环外声明用于类构造函数的变量?

时间:2018-03-22 17:47:57

标签: java

我正在使用任务管理器监视我的应用程序,并发现RAM的使用率不断上升。

我很快注意到我在for循环的每次迭代中初始化了一个新变量:

for (int i = 0; i < List.size(); i++)
{

    data = List.get(i); //This is already declared outside
    CustomThread thread2= new CustomThread(data);
    executor.execute(thread2);

}

现在,在循环之外声明CustomThread thread2是否有任何好处?

以后访问时,execute(thread2)是否仍然可以连接到原始对象?或者,对象被覆盖,并被覆盖每个execute,导致它做同样的事情(行为是基于数据的)?

编辑:

我大概需要200个线程(它们不是太重但是它们连接到网站),而且它之前的片段和代码是runnable每20秒调用一次(所以是的,我每分钟创建大约600个线程)

3 个答案:

答案 0 :(得分:1)

除了作用域之外,声明变量无关紧要;您创建对象的地方很重要,因为您可能需要在每次调用时使用不同的 executor.execute对象调用CustomThread。 (如果不这样做,那么很明显,在循环外创建一个对象并重用它。)

你拥有它的方式就是我写它的方式,除了:

  1. 如果您不需要其他任何内容,您可能会完全取消该变量:

    executor.execute(new CustomThread(data));
    
  2. 我可以在循环体中声明data,除非你有充分的理由在外面声明它。

  3. ...因为如果在循环外不需要它,则扩大thread2变量的范围没有任何好处。

答案 1 :(得分:0)

没有。 当您使用关键字 new 时,您将创建一个新的内存地址,因此您将始终为每次迭代创建一个新线程。

答案 2 :(得分:0)

很明显,实际代码不会导致直接内存消耗问题。

dataList的元素。为其分配临时变量不会创建新对象。它只是创建一个实际对象的“链接”。

您的问题可能与您在线程中执行的操作有关 同时创建和运行数百个创建对象的线程最终可能会创建一些非常重要的对象 而不是猜测,使用监视工具作为JVisualVM,你应该很容易找到罪魁祸首。