为什么我得到“xxx已定义”编译器错误?

时间:2010-09-10 18:59:06

标签: java compiler-construction

我正在尝试使用threadname1,threadname2,.. threadnamen等变量创建多个线程。我没有将它作为硬编码值给出,而是尝试使用for循环获取n个数字,并在“threadname”字符串的末尾使用它。它会引发一些错误。我该如何解决这个问题?

public class RunnableExample{

    public static void main(String[] args){
        String Name = "";
        String Ip = "";
        for (int i=1; i<=2; i++){
            if(i == 1){
                Name = "irony";
                Ip = "82.209.27.24";
            }
            else{
                Name = "jocky";
                Ip = "98.12.098.56";
            }
            String runname = "threadname" + i;
            RunnableThread runname = new RunnableThread(Name,Ip);
              new Thread(runname).start();
        }

        //RunnableThread threadname1 = new RunnableThread("irony","82.209.27.24");
        //RunnableThread thread4 = new RunnableThread("jocky","98.12.098.56");
        //new Thread(threadname1).start();
        //new Thread(threadname2).start();
        try{

        }
        catch (InterruptedException e) {

        }
    }

输出:

bash-3.00# javac RunnableExample.java
RunnableExample.java:43: runname is already defined in main(java.lang.String[])
            RunnableThread runname = new RunnableThread(Name,Ip);

如何解决此问题?似乎需要一些类型转换。我不确定。

4 个答案:

答案 0 :(得分:10)

这是你的问题:

String runname = "threadname" + i;
RunnableThread runname = new RunnableThread(Name,Ip);

您正在尝试声明两个具有相同名称的变量。你不能这样做。更改其中一个变量的名称。变量名在Java中的编译时是固定的。你不能说“使用 this 变量的执行时间值的名称声明一个变量”,这是我认为你要做的。

如果您想要一种访问多个值的方法,请使用集合或数组。例如,您可能需要List<RunnableThread> - 在循环的每次迭代中将值添加到列表中。

我还强烈建议您确保在开始尝试使用线程之前了解Java(变量和集合)之类的基础知识。线程很复杂,很难推理 - 如果你正在努力学习核心语言,那就更难了。

答案 1 :(得分:1)

可能是拼写错误,你想输入:

String Name = "threadname" + i;
RunnableThread runname = new RunnableThread(Name,Ip);

答案 2 :(得分:1)

您必须更改包含线程名称的变量的名称:

        String threadName = "threadname" + i;
        RunnableThread runname = new RunnableThread(threadName, ip);

如果使用Java,那么要做的就是使用Java命名约定。例如,所有变量都以小写字母开头。


您可能想要这样做:

import java.util.HashMap;
import java.util.Map;

public class RunnableExample {

    public static void main(String[] args) {

        Map<String, RunnableThread> threadMap = new HashMap<String, RunnableThread>();

        String name = "";
        String ip = "";
        for (int i = 1; i <= 2; i++) {
            if (i == 1) {
                name = "irony";
                ip = "82.209.27.24";
            } else {
                name = "jocky";
                ip = "98.12.098.56";
            }
            String threadName = "threadname" + i;
            RunnableThread thread = new RunnableThread(name, ip);
            new Thread(thread).start();

            threadMap.put(threadName, thread);
        }

        threadMap.get("threadname1").getIp();
    }
}

资源:

答案 3 :(得分:0)

我不打算指出你发布的代码的问题,因为其他人已经有了。但是我会建议你不要使用for循环,如果你打算在其中进行检查,看看你在哪个迭代。这不是一个好习惯。事实上,非迭代解决方案实际上是更少的代码行和更清晰的......

Thread ironyThread = new RunnableThread("irony", "82.209.27.24");
Thread jockyThread = new RunnableThread("jocky", "98.12.098.56");
ironyThread.start();
jockyThread.start();

这样的事情会做你正在尝试的事情。我知道你说你想要它处理N个线程。我的解决方案仍然比你所遵循的模式更清晰;为每个迭代添加一个if检查不同的threadName值。