我试图在for循环中启动可变数量的线程,并希望将线程命名为prime1,prime2,[...]。
PrimeFinderThread
类从Thread扩展。
[...]
for (int i = 0; i <= numberThreads; i++) {
PrimeFinderThread ("prime" + i) = new PrimeFinderThread (lowerBoundary, interval);
}
[...]
我收到错误:
作业的左侧必须是变量。
来自("prime" + i)
启动 X 线程的可能解决方案是什么?每个线程都有一个单独的名称?
答案 0 :(得分:3)
尝试以下方法:
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
的额外参数并调用超类构造函数可能更容易。
public PrimeFinderThread (String name, int lowerBoundary, int interval) {
super(name); // instead of setName
// Do the other stuff
}
IMO,更好的方法是不扩展Thread
类,而是提供Runnable
,最好是某种ExecutorService
- 检查,例如来自Oracle网站的Executors JavaDoc或concurrency trail。
答案 1 :(得分:2)
对于Java中的赋值,您无法在=
运算符的左侧指定其他参数。因此,PrimeFinderThread ("prime" + i)
会保持无效。
相反,您应该只为构造函数定义一个附加参数,并使用super
关键字构造将其传递给父类构造函数。
您应该将创建的线程分配给某个变量
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类具有的构造函数。您可以将线程名称传递给PrimeFinderThread
的构造函数,然后将其传递给Thread
的构造函数。
例如:
public PrimeFinderThread (String name, int lowerBoundary, int interval)
{
super (name);
...
}
答案 2 :(得分:0)
您无法在Java中的左侧分配中使用X指定其他参数。 要给你的线程命名,你可以从线程的子类调用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();
}
}
}