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

时间:2011-09-19 23:57:38

标签: java

这可能是一个非常简单的问题,但我尝试过的事情似乎并不奏效。我承认我对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;
}

1 个答案:

答案 0 :(得分:1)

您可能希望扩展Thread类并创建一个构造函数,该构造函数接受您事先实例化的对象并将该对象传递给构造函数。这将允许Thread更改对象并能够查看线程外部的更改。这是最干净的方式。

您也可以在MockDataGenerator内和new Thread语句之外创建一个对象。这也可以在线程外部进行更改。