для любителей Multitasking

Модератор: Absurd

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

Есть 2 класса

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

public class ManagerThread 
{
	GamblingThread [] game;
	int NumOfRounds;
	static int counter=0;
	static  int rounds;
	static int done=0;
	int arrSize;
	int [] win;
	int [] loose;
	Object obj = new Object();
	
	public ManagerThread(int arrSize)
	{
		game = new GamblingThread[arrSize];
		int [] win = new int[arrSize];
		int [] loose = new int[arrSize];
		this.arrSize=arrSize;
	}
	private void StartGame(int round) throws InterruptedException
	{
		ManagerThread.rounds=round;
		for (int i=0;i<game.length;i++)
		{
			game[i] = new GamblingThread(i+15,obj);
			game[i].start();
		}
			
		while (ManagerThread.done!=arrSize)
		{
			if (GamblingThread.stop==arrSize)
				{			int max = Integer.MIN_VALUE;
							//if player passes his limit he loses, else he wins	
							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)
										loose[i]++;//game[i].LoseGame();
								else
									win[i]++;//game[i].WinGame();
							}
							synchronized(obj)
							{
							ManagerThread.counter++;
							GamblingThread.stop=0;
							System.out.println("GamblingThread.stop - changed to:"+GamblingThread.stop);
							
							}
					}
		}
		Print();
	}
	public void Print()
	{
		for (int i=0;i<win.length;i++)
		{
			System.out.println(i+15+" won "+win[i]+" loose "+loose[i]+" : "+(win[i]+loose[i]));
		}
	}
	
	
	public static void main(String[] args) 
	{
		ManagerThread m = new ManagerThread(4);
		try {
			
			m.StartGame(2);
			
		} catch (Exception e) { e.printStackTrace(); }
				
	}
}
И второй класс

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

import java.util.Random;
public class GamblingThread extends Thread 
{
	int sum;
	int limit;
	boolean endGame;
	static int stop =0;
	Object obj;
	
	
	public GamblingThread(int limit,Object obj)
	{
		this.limit = limit;	
		this.obj=obj;
	}
	
	public void run()
	{
		
		while (ManagerThread.counter<ManagerThread.rounds)
		{
			while (true)
			{
				Random random = new Random();
				sum+=(	Math.abs(random.nextInt()%5)+1	);
					if (sum>21)
					{
						sum=-1;
						break;
					}
					if (sum>limit)
					{
						endGame=random.nextBoolean();
						if (endGame==true)
						break;
					}
			}
			  synchronized(obj)
			  {
			GamblingThread.stop+=1;
			  }
			while (GamblingThread.stop!=0) { System.out.println(getName()+"..."+GamblingThread.stop); yield();}
			sum=0; endGame=false;	
		}
			ManagerThread.done++;
	}
		
	public int GetSum()
	{
		return sum;
	}
	
	
}
Вот кто мне скажет почему GamblingTherad.stop через некоторое время зацикливается на значение 1
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Согласно сановский нотации потоки надо периодически усыплять - может дело в этом??
В SAD - все в SAD.
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Не думаю. В любом случае это не должно повлиять на значение переменной.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Мне кажется здесь косяк кода, функция Random кривая идет задание прибовления 1, а потом вычитания его же,,,
Ну и происходит из-за постоянно выполняющийся функции Глюка-непонятные явления со значениями :)
Может есть смысл изменить тип числа, Boolean насколько помнится задается при надобности принятия числом значение правды или нет, ну если поднапречь мозг то возврат идет ответа в виде 1 - 0 может косячит здесь??!
Счастливо погеммороиться :)
[syntax=Delphi] [/syntax]
michael
Сообщения: 116
Зарегистрирован: 15 июл 2004, 13:06
Откуда: ISRAEL (ранее - из Литвы)
Контактная информация:

Извини, но твой диалект поставил меня в тупик. С трудом продравшись в дебрях великого и могучего точно могу сказать одно. Ни какой "косяк" и "кривая" не происходит в Random. Проблема в busy wait. Что то в threads обрабатывается быстрее или медленее чем надо, вследствие чего главный объект тоже промахивается с вычестлениями.
Дам побольше информации. Нужно написать игру "21" где все игроки как бы играют (бросают кости) паралельно. Но создавание threads довольно дорогое удовольствие, поэтому в конце раунда я не останавливаю thread , а даю знать главному объекту , что раунд закончен. Глав. объект высчитывает кто выиграл и если игра не закончилась даёт знать thread, что можно начинать следущий раунд.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Так товарищь кидай свой исходник, можно будет погеммороиться...

------------------------------------------------------------------------------
Программирование забавная штука-код может быть идеальным, а ничего не работать и наоборот.... :roll:
Ответить