PDA

Просмотр полной версии : как запустить дважды один и тот же Thread



michael
08.04.2005, 18: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
08.04.2005, 18:09
Не обращяйте внимания на ощибки синтакса

Oscar
08.04.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.04.2005, 20:25
это не соответствует требованием- start() создаёт новый THREAD а мне нужно запустить ТОТ же Thread

michael
08.04.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[i] = new GamblingThread(i+15);

}
}

public void StartRound(int rounds) throws Exception
{
while (NumOfRounds<rounds)
{
for (int i=0;i<game.length;i++)
game[i].start();
//wait for thread to end
for (int i=0;i<game.length;i++)
game[i].join();
//find thread with maximum points
for (int i=0;i<game.length;i++)
if (game[i].GetSum()>max && game[i].GetSum()<22)
max=game[i].GetSum();
//if player passes his limit he loses, else he wins
for (int i=0;i<game.length;i++)
{
if (game[i].GetSum()==-1 || game[i].GetSum()<max)
game[i].LoseGame();
else
game[i].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
08.04.2005, 20:32
michael, твой пост "подробнее" я не читал (может позже гляну).
Но. Тот код что я привёл - Ты просто не останавливай Thread ! Тогда тебе и не прийдётся пытаться её заново запускать!
ИМХО, это именно то, что нужно .. хотя ... скажу больше, когда твой код гляну.

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

michael
08.04.2005, 21:01
легко сказать не останавливай thread но мне то и нужно его остановить

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

michael
09.04.2005, 21:31
java.lang.IllegalThreadStateException

Absurd
11.04.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);
}
}