java - 从线程获取变量以供函数使用

标签 java

这可能是一个非常简单的问题,但我尝试过的方法似乎不起作用。我承认我对 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/

相关文章:

java - 当对象被其父类(super class)引用时,有什么方法可以访问子对象的变量吗?

java - 从类路径加载文件而不使用 InputStreams

java - 在 Spring Batch 分区中配置 gridSize

java - 终端中的 Visual Studio Code Java 路径

Java 的 BigDecimal.power(BigDecimal exponent) : Is there a Java library that does it?

java - 文章管理网站选择什么

java - 具有 DateFormatter 删除行为的 JSpinner

Java JRadioButton

java - selenium webdriver 不使用 apache poi 将数据写入 Excel 工作表

java - 泛型类型删除 ClassCastException