有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么会出现“xxx已定义”编译器错误?

我正在尝试使用threadname1、threadname2等变量创建多个线程,。。threadnamen。我没有把它作为硬编码的值,而是尝试对n个数字使用for循环,并在“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) 个答案

  1. # 1 楼答案

    可能是打字错误,您想键入:

    String Name = "threadname" + i;
    RunnableThread runname = new RunnableThread(Name,Ip);
    
  2. # 2 楼答案

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

            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. # 3 楼答案

    这就是你的问题:

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

    您试图声明两个同名的变量。你不能那样做。更改其中一个变量的名称。在Java中,变量的名称在编译时是固定的。你不能说“声明一个名为这个变量的执行时间值的变量”,我想你正试图这么做

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

    我还强烈建议您在开始尝试线程之前,确保了解Java的基础知识(如变量和集合)。线程是复杂的,并且很难推理——如果你在与核心语言作斗争,它将变得更加困难

  4. # 4 楼答案

    我不会费心指出你发布的代码的问题,因为其他人已经有了。然而,我建议您不要使用for循环,如果您要在其中执行if检查以查看您正在进行哪个迭代。这不是一个好的做法。事实上,非迭代解决方案实际上是更少的代码行和更干净的

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

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