我正在尝试使用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);
如何解决此问题?似乎需要一些类型转换。我不确定。
答案 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值。