Anurita Srivastava Ответов: 4

Как мне изменить эту программу, чтобы создать 50 потоков? Мой код создает только 47 потоков.


Цитата:
Вопрос-
Напишите программу под названием ReverseHello.java это создает поток (назовем его потоком 1). Поток 1 создает другой поток (поток 2); поток 2 создает поток 3; и так далее, вплоть до потока 50. Каждый поток должен печатать "Hello from Thread <num>!", Но вы должны структурировать свою программу таким образом, чтобы потоки печатали свои приветствия в обратном порядке.


class reversehello extends Thread{
	public void run()
	{
		for(int j=49;j>=0;j--)
			System.out.println("Hello from Thread <"+(j+1)+">");
		try{
			Thread.sleep(1000);
		}
		catch(Exception e)
		{System.out.println(e);}
	}
	public static void main(){
		reversehello t[]=new reversehello [50];
		for(int i=0;i<50;i++)
			t[i]=new reversehello();
		for(int i=49;i>=0;i--)
			t[i].start();
	}
}


Что я уже пробовал:

Я попытался создать массив размером 53 и запустить его от 52 до 0,но результат был тот же.Он создает только 47 потоков.

Philippe Mori

Зачем вам петля в обоих случаях run функции и в main функция?

Anurita Srivastava

Цикл в main предназначен для запуска() потоков,а в run-для печати выходных данных, фактически для печати номера потока.

Mohibur Rashid

Откуда вы знаете, что он создает только 47?

Anurita Srivastava

потому что выходные данные печатаются только до Hello из потока 47.

Mohibur Rashid

Ваше приложение запускает все 50 потоков + 1(основной поток). Но ваша логика неверна. Следуйте тому, что сказал Ричард Маккатчан

Patrice T

Программа не соответствует утверждениям, это просто неправильно.
он выводил что-то вроде 2500 приветственных сообщений.

Richard MacCutchan

Вы запустили все потоки из своего основного потока, а это не то, что говорят вам инструкции. Основной поток должен начать поток 1, который должен начать поток 2 и т. д.

4 Ответов

Рейтинг:
27

Richard MacCutchan

Какая-то логика, чтобы думать о:
1. объекту потока необходимо присвоить номер, чтобы сообщить ему, какой это порядковый номер.
2. Если порядковый номер меньше 51, то:
2.1. Он должен создать новый дочерний поток с порядковым номером + 1.
2.2. Затем он должен запустить дочерний поток и дождаться его завершения.
3. он должен напечатать сообщение "Привет" с его порядковым номером.
4. Затем он должен вернуться.

Основной метод класса должен создать первый поток с порядковым номером 1, а затем запустить его - не нужно ждать, пока он завершится.


Anurita Srivastava

Как я могу дать номер своей нити?Не могли бы вы объяснить подробнее?

Richard MacCutchan

Добавьте целочисленное поле к вашему reversehello класс и конструктор, принимающий целочисленное значение. Конструктор может затем сохранить его, а код в вашем run метод может это проверить.

Anurita Srivastava

о,Спасибо :)

Рейтинг:
2

Member 13079813

class App extends Thread{
	int counter;
	public App(int counter){
		this.counter=counter;
	}
	public void run()
	{
		if(counter<50)
		{
			createThread(counter+1);	
		}
		System.out.println("hello" + counter);	
	}
	public void createThread(int counter) {
		App t=new App(counter);
		t.start();		
		try {
			t.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
	public static void main(String[] arg){		
		App t = new App(1);
		t.start();		
	}
}


Рейтинг:
0

Patrice T

Поскольку ваша главная проблема заключается в том, что у вас 47 потоков вместо 50 и что вы не заметили 2500 сообщений "Привет" вместо 50, я подозреваю, что проблема заключается в вашем методе подсчета.

Цитата:
Вопрос-
Напишите программу под названием ReverseHello.java это создает поток (назовем его потоком 1). Поток 1 создает другой поток (поток 2); поток 2 создает поток 3; и так далее, вплоть до потока 50. Каждый поток должен печатать "привет от потока !", но вы должны структурировать свою программу таким образом, чтобы потоки печатали свои приветствия в обратном порядке.
Ваш код не делает этого вообще, он не немного отличается, он совершенно другой. Полное переписывание в порядке.


Рейтинг:
0

Member 12759301

Это мое очень быстрое решение. Есть улучшения, которые необходимо сделать.

class reverseGreeting extends Thread
{
  private int counter;
 public reverseGreeting(int counter)
 {
   super("Thread" + counter);
   this.counter = counter;
 }
  
 public void run()
 {
    counter++ ;
   if(counter <= 51)
   {
   reverseGreeting thr = new reverseGreeting(counter);
  thr.start();
  try {
    thr.join();
     System.out.println("Hello from "+ getName()); 
  }
  catch (Exception e)
  {
   //do smth
  }
   }
 } 

 public static void main (String args[])
 {
   reverseGreeting th1 = new reverseGreeting(1);
   th1.start();
 }
 
}