2010-09-10 34 views
-1

我想創建多個線程使用變量像threadname1,threadname2,.. threadnamen。而不是將它作爲一個硬編碼的值,我試圖使用for循環爲n個數字並在「threadname」字符串的末尾使用它。它會引發一些錯誤。我如何解決這個問題?爲什麼我得到一個「xxx已經定義」的編譯器錯誤?

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

請問該如何解決這個問題?看起來可能需要一些類型轉換。我不確定。

+0

不要命名變量'Name'或'Ip'。第一個字符是大寫字母,表示該標識符引用_class_而不是字段。改爲使用'name'和'ip'。 – 2010-09-10 20:59:24

回答

10

這是你的問題:

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

你試着用相同的名稱聲明兩個變量。你不能那樣做。更改其中一個變量的名稱。變量名稱在Java編譯時固定。你不能說「聲明一個變量的執行時間值爲這個變量的名稱」這是我認爲你正在嘗試做的事情。

如果您想要一種訪問多個值的方式,請使用集合或數組。例如,您可能需要在此處輸入List<RunnableThread> - 在循環的每次迭代中將值添加到列表中。

我也強烈建議你確保你理解Java的基礎知識(如變量和集合的東西),你開始嘗試實驗穿線。線程複雜並且很難推理 - 如果你在使用核心語言掙扎,這將變得更加困難。

+0

我明白了這個問題。我喜歡使用「threadname + i」來創建新線程。即RunnableThread threadname1,2,... n = new RunnableThread(Name,Ip);你能指導我嗎?所以在這裏創建五個線程而不是寫五次這個語句,我試圖用一行來完成。你可以幫我嗎。 – Ricks 2010-09-10 19:08:02

+0

有沒有辦法知道創建基於字符串的變量名稱,但是我同意Jon Skeet使用List是最好的方法 – Albinoswordfish 2010-09-10 19:31:01

+1

@Ricks - 您的評論意味着您不理解問題。你試圖用相同的名稱聲明兩個變量; 「runname」。更改其中一個變量的名稱,您的代碼將起作用。但是,我也同意Jon的觀點,即在嘗試使用線程之前,您應該更熟悉Java並獲得一些經驗。你遇到的問題是編譯時錯誤,很容易解決。你說「它會拋出一些錯誤」,這表明你不瞭解Java語言。 – 2010-09-10 19:35:07

1

可能是一個錯字,你想輸入:

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

我認爲OP希望變量名稱爲「threadname1」,「threadname2」,... – Albinoswordfish 2010-09-10 19:28:35

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

資源:

+0

我希望變量runname是runname1,runname2..runnamen。不是傳遞給RunnableThread方法的參數。請幫忙。 – Ricks 2010-09-10 19:39:12

+0

+1鏈接到Java命名約定 – 2010-09-10 19:45:22

+0

@Ricks:正如我們所說的,你不能那樣做。變量的名稱將與您在源代碼中編寫的內容完全一致 - 它不會在執行時進行評估。你應該使用一個集合。 – 2010-09-10 19:48:42

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值。

+0

感謝您的幫助。這只是我正在處理的示例代碼。我將讀取一個input.txt文件,它有大約1000個名字和它的IP地址。我需要讀取這1000個名字,並創建一個線程來完成其他任務。所以我打算在單線創建中這樣做。你能否建議我怎麼做到這一點。 – Ricks 2010-09-10 19:50:01

相關問題