我正在编写一个包含列表的类。我正在从 Runnable
的运行方法实例化列表。作为:
public void sendEmailToLegalUsers() {
Log.info("JYM====================================");
try {
new Runnable() {
public void run() {
userCns = new ArrayList<String>();
recipients = new ArrayList<String>();
///other codes
}
};
} catch (Exception e) {
Log.info("Error occurred in LDAPSendMail: "+ e.getMessage());
}
Log.info("END====================================");
}
现在每次调用 sendEmailToLegalUsers 方法时都会有一个新线程。现在我想知道列表的内存范围是否限制在类级别(如果它限制在类级别并且如果说这个方法被调用两次那么当线程 1 创建的列表也有a Thread 2) 或者当线程在自己的范围内运行时,列表将对每个线程具有不同的范围。是否有机会在两个或多个线程之间混淆列表数据?
最佳答案
如果您为两个线程使用相同的 Runnable
类,那么是的,将会有重叠。如果您的每个线程都有一个单独的 new Runnable()
那么不,它们将是单独的列表实例但是这仅在列表被定义为本地的情况下Runnable
。如果列表是在调用类中定义的,那么在您第二次调用您的方法时,userCns
和 recipients
字段将被覆盖。
在您的情况下,我根本没有看到任何线程被 fork 。我只看到你实例化了 Runnable
。你确定你不是在尝试做类似的事情吗:
new Thread(new Runnable() {
public void run() {
// lists are local to the runnable
List<String> userCns = new ArrayList<String>();
List<String> recipients = new ArrayList<String>();
///other codes
}
}).start();
在这种情况下,每次调用 sendEmailToLegalUsers()
方法时,都会创建一个包含新列表的新 Runnable
。
关于java - Thread中List的内存范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12180407/