使用for循环创建和命名多个同步线程

时间:2015-05-17 04:27:50

标签: java multithreading

有没有办法创建多个与for循环同时运行的线程?考虑这个例子:

for(int i = 1; i<=36; i++) {
     if(new Random().nextInt(2)==0){
         ActionThread nr = new ActionThread();
     }
}

我不想在完成if语句后杀死线程。每个线程的结尾是在ActionThread类本身中随机确定的。另外,如何自动命名线程?例如,代替nr,第一个线程应该命名为nr1,第二个nr2,第三个nr3,依此类推。

3 个答案:

答案 0 :(得分:1)

我假设ActionThread是您创建的扩展Thread的自定义类。

  

我不想在完成if语句后杀死线程。

他们不会成功。但是,它看起来还没有启动它们。阅读Thread的javadoc。阅读顶部的资料,然后查看start()run()方法。

如果你没有开始一个线程......没有任何反应。

此外,如果您希望应用程序的某些其他部分能够“做事”,那么#34;一旦创建了线程,就应该将nr局部变量替换为应用程序其余部分可以获得的数据结构;例如列表或数组。

(也可以通过ThreadGroup树找到现存的线程,但它很复杂。)

  

另外,我如何自动命名线程?

调用Thread.setName(),或将线程名称传递给(相关)Thread构造函数。例如:

  nr.setName("thr" + i);

或者您甚至可以让ActionThread在构造函数中设置自己的名称。

我还应该指出,创建Thread的子类通常被认为是个坏主意。最好将线程逻辑放入自定义Runnable类中,然后创建Runnable实例并将其作为Thread构造参数传递。像这样:

    public class MyRunnable implements Runnable {
         @Override
         public void run() {
              // thread logic goes here
         }
    }

    Thread th = new Thread(new MyRunnable());
    th.start();

如果要将参数传递给线程逻辑,请使用一些参数向runnable类添加构造函数,并在实例化runnable时提供它们。

为什么这样?因为它允许您轻松地更改代码以使用线程循环或执行程序或其他类似的东西。

答案 1 :(得分:1)

public static void main(String[] a) {
    List<ActionThread> threads = new ArrayList<>();
    for (int i = 1; i <= 36; i++) {
        if (new Random().nextInt(2) == 0) { // no idea why you have put this
                                            // but seems unecessary
            ActionThread thread = new ActionThread();
            threads.add(thread);
            thread.start();
        }
    }
}
class ActionThread extends Thread {
    @Override
    public void run() {
        // Write what to do in Thread here
    }
}

一旦ActionThread列表存在,您就可以处理已创建的所有线程。使用threads.get(index)。从问题看来,按名称你的意思是Thread实例

答案 2 :(得分:0)

对于自动命名,可以在ActionThread中使用静态字段(计数器)并在生成线程名称之前在构造函数中递增它。

 class ActionThread extend Thread {
      private static int id = 0;
      ActionThread() {
           setName(String.format("n%d", ++id);
      }
 }