Почему я получаю сообщение об ошибке «xxx is notfined»? - PullRequest
0 голосов
/ 10 сентября 2010

Я пытаюсь создать несколько потоков, используя такие переменные, как 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 ]

10 голосов
/ 10 сентября 2010

Это ваша проблема:

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

Вы пытаетесь объявить две переменные с одинаковым именем. Вы не можете сделать это. Измените имя одной из переменных. Имена переменных фиксируются во время компиляции в Java. Вы не можете сказать «объявить переменную с именем значения времени выполнения this variable», что, как я думаю, вы пытаетесь сделать.

Если вы хотите получить доступ к нескольким значениям, используйте коллекцию или массив. Например, вам может потребоваться List<RunnableThread> здесь - добавлять значение в список на каждой итерации цикла.

Я бы также настоятельно рекомендовал убедиться, что вы понимаете основы Java (такие вещи, как переменные и коллекции) до вы начнете экспериментировать с многопоточностью. Потоки сложны и могут быть очень трудными для размышления - это будет еще сложнее, если вы боретесь с базовым языком.

1 голос
/ 10 сентября 2010

Вы должны изменить имя вашей переменной, содержащей имя потока:

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

Ресурсы:

1 голос
/ 10 сентября 2010

Возможно, опечатка, которую вы хотели напечатать:

String Name = "threadname" + i;
RunnableThread runname = new RunnableThread(Name,Ip);
0 голосов
/ 10 сентября 2010

Я не стану указывать на проблему вашего размещенного кода, потому что другие уже имеют. Однако я предлагаю вам не использовать цикл for, если вы собираетесь делать внутри него проверки, чтобы увидеть, на какой итерации вы находитесь. Это не очень хорошая практика. Infact, не итеративное решение на самом деле меньше строк кода и чище ...

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...