从线程外部访问字符串

时间:2014-01-02 20:46:05

标签: java string multithreading variables

我是java世界的新手,而且我一直试图找到这个问题的答案而不能。那么有人可以解释我如何从线程外部使用已经初始化的String。这是我想要使用的字符串的代码是“name”但是如果我将“name”设为final,我就无法为其设置值。

public class Users {

    public static void GenerateNames() {

        String name = "";
        String str;
        for (int i = 0; i <= 2; i++)

            name = name + RandNames.GenerateRandomChar();

        str = name;

        Hashtable ht = new Hashtable();

        if (ht.get(str) == null)
        {
            ht.put(str, name);
        }
        else {

        }

        Runnable r = new Runnable() {
            public void run() {

                int Anketa = (int) (1 + Math.random() * 6);

                Hashtable voting = new Hashtable();

                if (voting.get(name) == null)
                {

                }
            }
        };
        new Thread(r).start();
    }
}

还有一个问题是我把“其他”留空了。我只是需要它什么都不做。

3 个答案:

答案 0 :(得分:2)

只需将生成name的代码移动到单独的方法中:

public static String GenerateRandomName() {
    StringBuilder name = new StringBuilder();
    for (int i = 0; i <= 2; i++) {
        name.append(RandNames.GenerateRandomChar());
    }
    return name.toString();
}

你将能够name决赛:

public static void GenerateNames() {
    final String name = GenerateRandomName();
    ...
}
  

还有一个问题是我把“其他”留空了。我只是需要它什么都不做。

完全省略它:

if (ht.get(str) == null)
{
    ht.put(str, name);
}

答案 1 :(得分:0)

为了在 run 方法中使用 name 变量,您可以将此变量声明为Users类的成员,并将其标记为static,因为它在static中使用范围。

public class Users {

private static String name = "";

public static void GenerateNames() {

    // your code

    Runnable r = new Runnable() {
        public void run() {
            int Anketa = (int) (1 + Math.random() * 6);
            Hashtable voting = new Hashtable();
            if (voting.get(name) == null) {

            }
        }
    };
    new Thread(r).start();
}

}

答案 2 :(得分:0)

解决此类问题的一种方法是使用第二个局部变量:

public static void GenerateNames() {

    String workName = "";  // you can probably think of a better variable name
    for (int i = 0; i <= 2; i++)
        workName = workName + RandNames.GenerateRandomChar();

    final String name = workName;

现在您可以在匿名内部类中使用name。 (这是我经常使用的模式。)