这可能是一个非常简单的问题,但我尝试过的事情似乎并不奏效。我承认我对Java的理解不是很好,这是我第一次使用Threads
,所以在这里,
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:
编辑显示完整代码,基本上我想要的是将Thread中的用户List传递给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;
}
答案 0 :(得分:1)
您可能希望扩展Thread类并创建一个构造函数,该构造函数接受您事先实例化的对象并将该对象传递给构造函数。这将允许Thread更改对象并能够查看线程外部的更改。这是最干净的方式。
您也可以在MockDataGenerator
内和new Thread
语句之外创建一个对象。这也可以在线程外部进行更改。