【问题标题】:Access string from outside a thread从线程外部访问字符串
【发布时间】:2014-01-02 20:46:05
【问题描述】:

我是 Java 世界的新手,我一直试图找到这个问题的答案,但找不到。那么有人可以解释我如何从线程外部使用已经初始化的字符串。这是我想要使用的字符串是“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();
    }
}

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

【问题讨论】:

    标签: java string multithreading variables


    【解决方案1】:

    只需将生成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();
        ...
    }
    

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

    完全省略:

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

    【讨论】:

      【解决方案2】:

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

      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。 (这是我经常使用的模式。)

      【讨论】:

        【解决方案3】:

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

        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();
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2014-06-12
          • 2015-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-23
          • 2011-08-01
          • 2011-05-31
          • 1970-01-01
          相关资源
          最近更新 更多