Java 从不同名称的 for 循环运行多个线程
Java run multiple threads from for loop with different names
我试图在 for 循环中启动可变数量的线程,并想将线程命名为 prime1、prime2、[...]。
PrimeFinderThread
Class 从线程扩展。
[...]
for (int i = 0; i <= numberThreads; i++) {
PrimeFinderThread ("prime" + i) = new PrimeFinderThread (lowerBoundary, interval);
}
[...]
我遇到错误:
The left-hand side of an assignment must be a variable.
来自 ("prime" + i)
启动 X 线程的可能解决方案是什么?
对于 Java 中的赋值,您不能在 =
运算符的左侧指定其他参数。所以 PrimeFinderThread ("prime" + i)
是并将保持无效。
相反,您应该简单地为构造函数定义一个附加参数,然后使用 super
关键字构造将其传递给父 class 构造函数。
您应该将创建的线程分配给某个变量
PrimeFinderThread[] threads = new PrimeFinderThread[numberThreads];
for (int i = 0; i < numberThreads; i++) {
threads[i] = new PrimeFinderThread ("prime" + (i+1), lowerBoundary, interval);
threads[i].start();
}
至于设置每个线程的名称,这取决于您的 PrimeFinderThread class 具有哪些构造函数。您可以将线程名称传递给 PrimeFinderThread
的构造函数,然后从那里将其传递给 Thread
.
的构造函数
例如:
public PrimeFinderThread (String name, int lowerBoundary, int interval)
{
super (name);
...
}
尝试以下操作:
Thread[] threads = new PrimeFinderThread[numberThreads];
for (int i = 0; i < numberThreads; i++) {
threads[i] = new PrimeFinderThread (lowerBoundary, interval);
threads[i].setName("prime" + i);
threads[i].start();
}
它通过 setName
方法设置名称,然后通过调用 start
启动每个线程。
但是,让 PrimeFinderThread
的构造函数接受一个额外的参数 name
并调用超级 class 构造函数可能更容易。
public PrimeFinderThread (String name, int lowerBoundary, int interval) {
super(name); // instead of setName
// Do the other stuff
}
IMO,更好的方法是不是扩展Thread
class而是提供Runnable
,最好是某种ExecutorService
- 检查例如来自 Oracle 网站的 Executors JavaDoc or the concurrency trail。
您不能在 Java 的左侧赋值中用 X 指定附加参数。
要为您的线程命名,您可以从线程的子 class 调用 super(threadName) 或可以使用 thread.setName("threadName")。
public class ThreadSubClass extends Thread{
public ThreadSubClass(String threadName){
super(threadName);
}
@Override
public void run(){
System.out.println("Entering : " + getName());
//do Something
}
public static void main(String [] args){
for(int i=0;i<5;i++){
ThreadSubClass t = new ThreadSubClass("Prime"+i);
t.start();
}
}
}
我试图在 for 循环中启动可变数量的线程,并想将线程命名为 prime1、prime2、[...]。
PrimeFinderThread
Class 从线程扩展。
[...]
for (int i = 0; i <= numberThreads; i++) {
PrimeFinderThread ("prime" + i) = new PrimeFinderThread (lowerBoundary, interval);
}
[...]
我遇到错误:
The left-hand side of an assignment must be a variable.
来自 ("prime" + i)
启动 X 线程的可能解决方案是什么?
对于 Java 中的赋值,您不能在 =
运算符的左侧指定其他参数。所以 PrimeFinderThread ("prime" + i)
是并将保持无效。
相反,您应该简单地为构造函数定义一个附加参数,然后使用 super
关键字构造将其传递给父 class 构造函数。
您应该将创建的线程分配给某个变量
PrimeFinderThread[] threads = new PrimeFinderThread[numberThreads];
for (int i = 0; i < numberThreads; i++) {
threads[i] = new PrimeFinderThread ("prime" + (i+1), lowerBoundary, interval);
threads[i].start();
}
至于设置每个线程的名称,这取决于您的 PrimeFinderThread class 具有哪些构造函数。您可以将线程名称传递给 PrimeFinderThread
的构造函数,然后从那里将其传递给 Thread
.
例如:
public PrimeFinderThread (String name, int lowerBoundary, int interval)
{
super (name);
...
}
尝试以下操作:
Thread[] threads = new PrimeFinderThread[numberThreads];
for (int i = 0; i < numberThreads; i++) {
threads[i] = new PrimeFinderThread (lowerBoundary, interval);
threads[i].setName("prime" + i);
threads[i].start();
}
它通过 setName
方法设置名称,然后通过调用 start
启动每个线程。
但是,让 PrimeFinderThread
的构造函数接受一个额外的参数 name
并调用超级 class 构造函数可能更容易。
public PrimeFinderThread (String name, int lowerBoundary, int interval) {
super(name); // instead of setName
// Do the other stuff
}
IMO,更好的方法是不是扩展Thread
class而是提供Runnable
,最好是某种ExecutorService
- 检查例如来自 Oracle 网站的 Executors JavaDoc or the concurrency trail。
您不能在 Java 的左侧赋值中用 X 指定附加参数。 要为您的线程命名,您可以从线程的子 class 调用 super(threadName) 或可以使用 thread.setName("threadName")。
public class ThreadSubClass extends Thread{
public ThreadSubClass(String threadName){
super(threadName);
}
@Override
public void run(){
System.out.println("Entering : " + getName());
//do Something
}
public static void main(String [] args){
for(int i=0;i<5;i++){
ThreadSubClass t = new ThreadSubClass("Prime"+i);
t.start();
}
}
}