Java使用不同的名称从for循环运行多个线程

时间:2015-01-08 11:48:42

标签: java multithreading for-loop

我试图在for循环中启动可变数量的线程,并希望将线程命名为prime1,prime2,[...]。

PrimeFinderThread类从Thread扩展。

[...]

    for (int i = 0; i <= numberThreads; i++) {
         PrimeFinderThread ("prime" + i) = new PrimeFinderThread (lowerBoundary, interval); 
    }

[...]

我收到错误:

  

作业的左侧必须是变量。

来自("prime" + i)

启动 X 线程的可能解决方案是什么?每个线程都有一个单独的名称?

3 个答案:

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

}