2013-12-09 6 views
-1

Как вычислить числа потоков, если я создаю два новых потока в прогоне метода? Он создается много раз и падает, когда память закончена.Как рассчитать числа потоков?

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

    } 

     } 
     } 
    } 
} 

ответ

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

Либо последнего две версии будут запускаться три раза es, каждый раз запуская два новых потока, создавая в общей сложности шесть потоков.

Чтобы получить именно 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--; 
    } 
+0

oh ... его не имеет значения, когда я начинаю новую тему, ее NEW x = 0, и все потоки начинаются с x = 0 и начинают увеличивать ее до 3, но я хочу получить нумер для потоков например 8; А в RabbitPrinter я запускаю две новые темы. 1 -> 2 -> 4 -> 8, и в этот момент я хочу STOP; Как это сделать? – user3081544

+0

Просто икру * ОДНА нить * за итерацию? Или подсчитайте точное количество потоков, т. Е. 'X + = 2', вместо' x ++ '. – Domi

+0

Обратите внимание, что вы не можете порождать нечетное количество потоков, если вы создаете два на каждой итерации. – Domi

0

Я не уверен, что вы пытаетесь сделать.

здесь x = 0 и вы соответствие x!=3 и декремент x .. так x никогда не будет 3.

приращения х вместо декремента ....

x++ 
+0

oh ... его не имеет значения. Когда я начинаю новую тему, ее NEW x = 0, и все нитки начинаются с x = 0 и начинают увеличивать ее до 3, – user3081544

+0

, но вы обжариваете .. увеличивайте x. ,см. мой отредактированный ответ – stinepike

+0

его небольшая ошибка, им жаль, но мой вопрос по-прежнему – user3081544

0

Предполагая, что вы хотите, чтобы ваш цикл counter, чтобы применить ко всем потокам, а не только к одному, поэтому вместо использования «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(); 
    } 
    } 
} 
} 
+0

спасибо, его помогает мне – user3081544

0

Вы можете создать определенное количество потоков и останавливается, когда вы достигнете предела, используя FixedThreadPool из (исполнителях) [http://docs.oracle.com/javase/7 /docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29]

Кроме того, ExecutorService предоставляет утилиты для отключения пула.

Смежные вопросы