这可能是一个非常简单的问题,但我尝试过的方法似乎不起作用。我承认我对 Java 的理解不是很好,这是我第一次使用线程
,所以就这样吧,
public MockDataGenerator() {
new Thread() {
@Override
public void run() {
while (true) {
try {
if (bayeuxIds.size() > 0) {
System.out.println("These are the bayeuxIds from new Thread" + bayeuxIds);
List<String> users = new ArrayList<String>();
users.addAll(bayeuxIds);
setData(users);
Collections.shuffle(users);
String bayeuxId = users.get(0);
List<Alert> alerts = generateRandomAlerts(1);
alertsAdded(bayeuxId, alerts);
}
} catch (Throwable t) {
} finally {
try {
int numUsers = bayeuxIds.size();
// plus 1 prevents divide by zero
sleep(30000);
//sleep(r.nextInt(120000 / (numUsers + 1)));
} catch (InterruptedException e) {
}
}
}
}
}.start();
}
public void onMessage(Message message) {
System.out.println("Message recieved from ActiveMQ");
if (message instanceof TextMessage) {
try {
System.out.println("This is the 0th element of usersCopy: " + users.get(0));
String bayeuxId = users.get(0);
String theMsg = ((TextMessage) message).getText();
clientMessanger.sendUpdate(theMsg, bayeuxId);
} catch (Exception e) {
e.printStackTrace();
}
} else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
}
编辑1:
编辑以显示完整的代码,基本上我想要的是将线程中的用户列表传递到 onMessage 函数中。我尝试了一些 getter 和 setter,但这不起作用,因为我认为我必须使用同步函数才能正常工作?
编辑2:
添加了这些函数,但似乎仍然没有正确设置变量。我做错了什么?
String bayeuxIdCopy;
public synchronized void setData(String bayeuxId) {
System.out.println("This is the bayeuxID being set: " + bayeuxId);
bayeuxIdCopy = bayeuxId;
}
public synchronized String getData() {
System.out.println("This is the bayeuxID being returned: " + bayeuxIdCopy);
return bayeuxIdCopy;
}
最佳答案
您可能想要扩展 Thread 类并创建一个构造函数,该构造函数接受您事先实例化的对象并将该对象传递给构造函数。这将允许线程更改对象并能够看到线程外部的更改。这是最干净的方式。
您还可以在 MockDataGenerator
内部和 new Thread
语句外部创建一个对象。通过更改,这也可以在线程外部访问。
关于java - 从线程获取变量以供函数使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7478673/