如何计算线程数?

时间:2013-12-09 04:53:25

标签: java multithreading

如果我在方法运行中创建两个新线程,如何计算线程数?它创造了很多次,并在记忆结束时堕落。

public class RabbitLab {
    public static void main(String[] args) {
        new Thread(new RabbitPrinter()).start();
    }

}


class RabbitPrinter implements Runnable {
    public void run() {
      for ( int y=0 ; y < 3 ; y++){
        System.out.println("New rabbit born!");
        int x=0;
        while (x != 3) {
      {

        new Thread(new RabbitPrinter()).start();
        new Thread(new RabbitPrinter()).start();
      x++

    }

        }
       }
    }
}

4 个答案:

答案 0 :(得分:1)

你正指向错误的方向,导致无限循环:

    int x=0;
    while (x != 3) {
        new Thread(new RabbitPrinter()).start();
        new Thread(new RabbitPrinter()).start();
        x--;
    }

尝试改为:

    int x=3;
    while (x != 0) {
        new Thread(new RabbitPrinter()).start();
        new Thread(new RabbitPrinter()).start();
        x--;
    }

或者:

    int x=0;
    while (x != 3) {
        new Thread(new RabbitPrinter()).start();
        new Thread(new RabbitPrinter()).start();
        x++;
    }

后两个版本中的任何一个都会运行三次,每次启动两个新线程,共创建六个线程。

要准确获取n个主题,请使用简单的for循环:

const int n = 3;
for (int i = 0; i < n; ++i)
{
    new Thread(new RabbitPrinter()).start();
}

或者,作为while循环:

    int x = 3;
    while (x != 0) {
        new Thread(new RabbitPrinter()).start();
        x--;
    }

答案 1 :(得分:0)

我不确定你想做什么。

此处为x = 0,您正在匹配x!=3并递减x ..所以x永远不会是3。

增加x而不是递减....

x++

答案 2 :(得分:0)

假设您希望循环计数器应用于所有线程,而不仅仅是一个,因此不应将'x'用作局部变量,而应将其声明为静态(因此它由所有实例共享)和一个AtomicInteger(所以所有线程都可以安全地更新它而不会出现争用问题):

试试这个:

class RabbitPrinter implements Runnable {
private static AtomicInteger x = new AtomicInteger(0);
 public void run() {
  for ( int y=0 ; y < 3 ; y++){
    System.out.println("New rabbit born!");

    while (x.getAndIncrement() < 3) {
     new Thread(new RabbitPrinter()).start();
     new Thread(new RabbitPrinter()).start();
    }
  }
 }
}

答案 3 :(得分:0)

你可以使用(Executors)中的FixedThreadPool创建一定数量的线程并在达到限制时停止[http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ Executors.html#的newFixedThreadPool%28int%29]

除此之外,ExecutorService还提供了关闭池的实用程序方法。