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,更好的方法是不是扩展Threadclass而是提供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();
        }
    }

}