как запустить дважды один и тот же Thread

Модератор: Absurd

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

как запустить дважды один и тот же Thread

Сообщение michael » 08 апр 2005, 17:07

Cуществует следущий код

Код: Выделить всё

class MyClass
{
          Mythread thread = new MyThread()

   public void StartProgram()  throws Exception
   {
        thread.start();
        thread.join();
        thread.start();
   }
} 
 
Когда запускаю StartProgram() получаю Exception (зарание поясняю-делаю try и catch)
Вопрос как запустить thread , дождатся его завершения и запустить его сново Не создавая сново объект Mythread. (Как вы видете объект Mythread объявлен вне метода

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Сообщение michael » 08 апр 2005, 17:09

Не обращяйте внимания на ощибки синтакса

Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 12:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Сообщение Oscar » 08 апр 2005, 18:41

Глянь, может поможет.

Код: Выделить всё

	public void run() {
		Thread me = Thread.currentThread();
		while (relaxer == me) {
			relax(); // Собственно то, что Thread должен делать (для чего его вообще создавали ;-) ).
			try {
				relaxer.sleep(20);  //Delay to wait for the prior repaint command to finish.
				while (УСЛОВИЕ, ПО КОТОРОМУ Thread, типа,  останавливается) myWait();
			} catch (InterruptedException e) {
				break;
			}
		}                
	}

	private void myWait() { //I think it was Netscape that caused me not to use Wait, or was it java 1.1?
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			//break;
		}
	}

	public void start() {
		relaxer = new Thread(this);
		relaxer.start();
	}

	public void stop() {
		relaxer = null;
	}

Код выдран из одного класса с http://www.touchgraph.com

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Сообщение michael » 08 апр 2005, 19:25

это не соответствует требованием- start() создаёт новый THREAD а мне нужно запустить ТОТ же Thread

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Сообщение michael » 08 апр 2005, 19:28

Раскажу поподробнее. Нужно написать игру 21 с использованием тредав. Но Thread модно создавать только один раз. Вот код
import java.util.Random;

public class GamblingThread extends Thread
{
Random random;
int sum;
int limit;
boolean endGame;
int win;
int loose;

public GamblingThread(int limit)
{
random = new Random();
this.limit = limit;
}

public void run()
{
sum=0; endGame=false;
while (true)
{
sum+=( (random.nextInt()%5)+1 );
if (sum>limit)
{
sum=-1;
break;
}
endGame=random.nextBoolean();
if (endGame==true)
break;
}
}
public void WinGame()
{
win++;
}
public void LoseGame()
{
loose++;
}
public int GetSum()
{
return sum;
}
public boolean GetRetierFromGame()
{
return endGame;
}

public String toString()
{
return limit+ " won "+win+" times "+loose+" times were disqualified";
}
}

А вот код главного класа


public class ManagerThread
{
int max= Integer.MIN_VALUE;
GamblingThread [] game;
int NumOfRounds;

public ManagerThread()
{
game = new GamblingThread[7];
InitThreads();
}
private void InitThreads()
{
for (int i=0;i<game.length;i++)
{
game = new GamblingThread(i+15);

}
}

public void StartRound(int rounds) throws Exception
{
while (NumOfRounds<rounds)
{
for (int i=0;i<game.length;i++)
game.start();
//wait for thread to end
for (int i=0;i<game.length;i++)
game.join();
//find thread with maximum points
for (int i=0;i<game.length;i++)
if (game.GetSum()>max && game.GetSum()<22)
max=game.GetSum();
//if player passes his limit he loses, else he wins
for (int i=0;i<game.length;i++)
{
if (game.GetSum()==-1 || game.GetSum()<max)
game.LoseGame();
else
game.WinGame();
}
NumOfRounds++;
}
}

public void Print()
{
for (int i=0;i<game.length;i++)
System.out.println(game[i]);
}


public static void main(String[] args)
{
ManagerThread m = new ManagerThread();
try {

m.StartRound(1000);

} catch (Exception e) { e.printStackTrace(); }

m.Print();

}
}

Аватара пользователя
Oscar
Сообщения: 958
Зарегистрирован: 29 май 2004, 12:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Сообщение Oscar » 08 апр 2005, 19:32

michael, твой пост "подробнее" я не читал (может позже гляну).
Но. Тот код что я привёл - Ты просто не останавливай Thread ! Тогда тебе и не прийдётся пытаться её заново запускать!
ИМХО, это именно то, что нужно .. хотя ... скажу больше, когда твой код гляну.

Не .. не буду ... мож кто другой тебе поможет.

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Сообщение michael » 08 апр 2005, 20:01

легко сказать не останавливай thread но мне то и нужно его остановить

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

Сообщение Kolinus » 08 апр 2005, 20:27

Ты бы написал что за эксепшн.
Мне кажется что в твоем случае происходит следующее:
join()- блокирующий вызов.
те пока он не завершится твой основной поток завершается
но остальные потоки к этому времени завершаются самостоятельно, а значит join к ним не катит
кинь в общем вывод эксепшна
В SAD - все в SAD.

michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 12:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Сообщение michael » 09 апр 2005, 20:31

java.lang.IllegalThreadStateException

Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Сообщение Absurd » 11 апр 2005, 10:57

С твим кодом влом разбираться. Вот например, как пул тредов делают.
Все ServerThread'ы будут мирно спать, пока не придет коннекшен. Когда он придет, какой-либо тред пробудится, обработает его и опять заснет.
И не надо никаких join'ов.

Код: Выделить всё

class ServerThread extends Thread {
   ...
   public void run() {
      while(true) {
         Connection conn = Listener.getInstance().getConnection();
         if(conn == null) { break; }
         // Работаем с соединением
      }
   }
}
//-----------------------------------------
class Listener extends Thread {
  private Listener() {};
  private static final Listener theInstance = new Listener();
  private final List connections = new LinkedList();
  public Listener getInstance() {
     return theInstance;
  }
   
  public void run() {
    while(true) {
      //..
      Connection conn = serverSocket.accept();
      acceptConnection(conn);
    }
  }
  
  private synchronized void acceptConnection (Connection conn) {
    connections.add(conn);
    notifyAll();
  }
  
  // ...
  public synchronized Connection getConnection() {
    //...
    while ( connections.isEmpty() ) {
      try {
        wait();
      } catch (InterruptedException e) {
        // ignored
      }
    }
    return connections.remove(0);
  }
}
2B OR NOT(2B) = FF

Ответить