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

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: как запустить дважды один и тот же Thread

Заболевания

AndreyGob » 15 май 2017, 22:16

Absurd » 11 апр 2005, 11: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);
  }
}

michael » 09 апр 2005, 21:31

java.lang.IllegalThreadStateException

Kolinus » 08 апр 2005, 21:27

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

michael » 08 апр 2005, 21:01

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

Oscar » 08 апр 2005, 20:32

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

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

michael » 08 апр 2005, 20: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();

}
}

michael » 08 апр 2005, 20:25

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

Oscar » 08 апр 2005, 19: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 » 08 апр 2005, 18:09

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

Вернуться к началу