Obsługa wątków i synchronizacja

0

Witam, czy ktoś może mi podsunąć pomysł w jaki sposób mogę przechodzić po klientach, jeśli dla każdego z nich tworzony jest osobny wątek i wszystkie one znajdują się w tablicy? Mianowicie zależy mi na tym, aby wątek 0 wykonywał jakieś zadanie, w danym momencie pozostałe czekają. Po zakończeniu pracy wątek 1 zostaje uruchomiony i wykonuje pewną czynność, pozostałe czekają itd. Myślałem o czymś takim:

while (true)
		{	
			for (server.setIterator(0); server.getIterator() < 10; server.increment())
			{
				if (tablicaZWątkami[server.getIterator()] == Thread.currentThread())
				{
				//polecenia
				}
		    }	
		}

server.increment - inkrementuje licznik
server.setIterator() - ustawia wartość licznika
server.getIterator() - zwraca wartość licznika

Próbowałem synchronized po otwarciu pętli while na obiekcie String z servera, bo jest wspólnym obiektem dla wszystkich wątków, jednak nie sprawdziło się. Przerobienie tego na funkcję synchronized też średnio w tym wypadku pasuje, ze względu na to, że //polecenia zawierają wczytywanie tekstu i wysyłanie komunikatów z czym może być problem ze strony servera, ponieważ w wątku mam już do tego celu stworzone obiekty PrintStream i DataInputStream. Chyba najlepiej by było użyć sekcji krytycznych, tylko coś nie działają.

2

Mianowicie zależy mi na tym, aby wątek 0 wykonywał jakieś zadanie, w danym momencie pozostałe czekają. Po zakończeniu pracy wątek 1 zostaje uruchomiony i wykonuje pewną czynność, pozostałe czekają itd..
chyba nie załapałeś na czym polega wielowątkowość.

0
spartanPAGE napisał(a):

Mianowicie zależy mi na tym, aby wątek 0 wykonywał jakieś zadanie, w danym momencie pozostałe czekają. Po zakończeniu pracy wątek 1 zostaje uruchomiony i wykonuje pewną czynność, pozostałe czekają itd..
chyba nie załapałeś na czym polega wielowątkowość.

Chyba nie wiesz, że jest to jedynie fragment run(), w którym akurat chcę wykonać to, co opisałem wyżej bez zawieszania wątków, ponieważ to wydaje się kiepskim rozwiązaniem, jeśli mam thread per client.

1

Mianowicie zależy mi na tym, aby wątek 0 wykonywał jakieś zadanie, w danym momencie pozostałe czekają. Po zakończeniu pracy wątek 1 zostaje uruchomiony i wykonuje pewną czynność, pozostałe czekają

Wszystko czego potrzebujesz znajduje się już w jdk - a studia są do bani

~ św. Tomasz z Palo Alto : (Array)List do koryntian.

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html

0
while (true)
				{
					synchronized (server.obiekt)
					{
						for (server.setIterator(0); server.getIterator() < liczbaWątków; server.iterator())
						{
							if (tablicaWątków[server.getIterator()] == tablicaWątków.currentThread())
							{
								server.countingIncrement(); // inkrementuje licznik
								if (server.getCounting() == (liczbaWątków - 1)) //getCounting() zwraca licznik z servera
								{
									server.obiekt.notifyAll();
									server.resetCounting(); // ustawia licznik na 0 z servera
								}
							}
						}
					}
					synchronized (server.obiekt)
					{
						{
							server.obiekt.wait();
						}
					}

				}

Zrobiłem to na tej zasadzie, umieściłem komentarze do metod, których nie opisałem wyżej. Działa, jednak jest problem. Mianowicie nie ustalam kolejności wątków, tylko randomowo są wywoływane. Po drugie istnieje możliwość, że jeden wątek zostanie wywołany jednokrotnie, podczas gdy inny np. trzykrotnie. I teraz pojawia się pytanie - zmodyfikuję to jakoś, tak aby iterowało po kolei po wątkach, czy jestem zmuszony wszystko przerabiać na inny sposób?

PROBLEM ROZWIĄZANY

1 użytkowników online, w tym zalogowanych: 0, gości: 1