如果我在方法运行中创建两个新线程,如何计算线程数?它创造了很多次,并在记忆结束时堕落。
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++
}
}
}
}
}
答案 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还提供了关闭池的实用程序方法。