Страница 1 из 2

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

Добавлено: 08 апр 2005, 18:07
michael
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 объявлен вне метода

Добавлено: 08 апр 2005, 18:09
michael
Не обращяйте внимания на ощибки синтакса

Добавлено: 08 апр 2005, 19:41
Oscar
Глянь, может поможет.

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

	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

Добавлено: 08 апр 2005, 20:25
michael
это не соответствует требованием- start() создаёт новый THREAD а мне нужно запустить ТОТ же Thread

Добавлено: 08 апр 2005, 20:28
michael
Раскажу поподробнее. Нужно написать игру 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();

}
}

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

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

Добавлено: 08 апр 2005, 21:01
michael
легко сказать не останавливай thread но мне то и нужно его остановить

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

Добавлено: 09 апр 2005, 21:31
michael
java.lang.IllegalThreadStateException

Добавлено: 11 апр 2005, 11:57
Absurd
С твим кодом влом разбираться. Вот например, как пул тредов делают.
Все 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);
  }
}