如何计算线程数



如果在方法运行中创建两个新线程,如何计算线程数?它创造了很多次,当记忆结束时就会消失。

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++
    }
        }
       }
    }
}

您的计数方向错误,导致无限循环:

    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--;
    }

我不确定你想做什么。

这里是x = 0,而您正在匹配x!=3并递减x。。所以CCD_ 7永远不会是3。

递增x而不是递减。。。。

x++

假设您希望循环计数器应用于所有线程,而不仅仅是一个线程,因此不应使用"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();
    }
  }
 }
}

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

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

最新更新