【发布时间】:2020-10-11 04:41:04
【问题描述】:
我有实现Runnable 的任务,它需要使用扩展TimerTask 的自定义类填充ArrayList。
我的代码:
public class ClusterSessionTask implements Runnable {
@Override
public void run() {
CheckTask checkTask = null;
Map<String, String> keyspaces = getKeyspaces(cluster_name);
for (Map.Entry<String, String> key_to_colfam : keyspaces.entrySet()) {
String k = key_to_colfam.getKey();
String c = key_to_colfam.getValue();
checkTask = new CheckTask(k, c, session);
tasks.add(checkTask);
}
}
}
您可以看到我在 for 循环中的每次迭代都初始化了新的 CheckTask,但我仍然会覆盖列表中的先前元素。
查看此调试信息:
CheckTask 是一个扩展TimerTask 的类:
class CheckTask extends TimerTask {
private static int i = 0;
private static String keyspace;
private static String colfam;
private static CqlSession session;
CheckTask(String k, String c, CqlSession s) {
keyspace = k;
colfam = c;
session = s;
}
public void run() {
...
}
@Override
public String toString() {
return keyspace + ":" + colfam;
}
}
我做错了什么?它以某种方式通过引用传递对象,而 new 推荐被忽略?
谢谢
【问题讨论】:
-
什么是 CheckTask?
-
抱歉 - 正在编辑相关信息。
-
你的变量是静态的...
-
我同意 assylias 的根本原因是你的变量是静态的,还要确保使用线程安全的数组列表(Collections.synchronizedList() 或 CopyOnWriteArrayList)
标签: java arraylist pass-by-reference