繁体   English   中英

从线程获取要由函数使用的变量

[英]Getting a variable from a thread to be used by a function

这可能是一个非常简单的问题,但是我尝试过的事情似乎没有用。 我承认我对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:

编辑以显示完整代码,基本上我想要的是将要从线程传递给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语句外部创建对象。 更改之后,也可以在线程外部访问此文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM