Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算线程数?_Java_Multithreading - Fatal编程技术网

Java 如何计算线程数?

Java 如何计算线程数?,java,multithreading,Java,Multithreading,如果在方法run中创建两个新线程,如何计算线程数?它创造了很多次,当记忆结束时,它就会下降 public class RabbitLab { public static void main(String[] args) { new Thread(new RabbitPrinter()).start(); } } class RabbitPrinter implements Runnable { public void run() { fo

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

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

    }

        }
       }
    }
}
公共类兔子实验室{
公共静态void main(字符串[]args){
新线程(新RabbitPrinter()).start();
}
}
类RabbitPrinter实现可运行{
公开募捐{
对于(int y=0;y<3;y++){
System.out.println(“新兔子出生!”);
int x=0;
而(x!=3){
{
新线程(新RabbitPrinter()).start();
新线程(新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--;
    }
或:

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

要准确获取
n
线程,请使用简单的
for
循环:

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

我不知道你想做什么

这里
x=0
您正在匹配
x=3
和递减
x
。。所以
x
永远不会是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();
    }
  }
 }
}
类RabbitPrinter实现可运行{
私有静态AtomicInteger x=新的AtomicInteger(0);
公开募捐{
对于(int y=0;y<3;y++){
System.out.println(“新兔子出生!”);
while(x.getAndIncrement()<3){
新线程(新RabbitPrinter()).start();
新线程(新RabbitPrinter()).start();
}
}
}
}

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


除此之外,Executor服务还提供了关闭池的实用方法。

噢。。。这并不重要,当我开始新线程时,它的新x=0,所有线程都从x=0开始,并开始将其递增到3,但您正在递减。。增加x。。请看我编辑的答案这是一个小错误,对不起,但我的问题还没有解决。。。它不重要,当我启动新线程时,它的新x=0,所有线程都从x=0开始,并开始将其递增到3,但我想得到线程的数量,例如8;在RabbitPrinter中,我运行了两个新线程。1->2->4->8,在这一刻我想停下来;怎么做?每次迭代只产生一个线程?或者计算线程的确切数量,即
x+=2
,而不是
x++
。请注意,如果每次迭代生成两个线程,则无法生成奇数个线程。请使用我的
进行
n=8
循环。
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();
    }
  }
 }
}