Obsługa wątków i synchronizacja

Obsługa wątków i synchronizacja
WR
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:9
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:

Kopiuj
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ą.

spartanPAGE
  • Rejestracja:około 12 lat
  • Ostatnio:około 2 godziny
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ść.

edytowany 1x, ostatnio: spartanPAGE
WR
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:9
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.

maryiusz
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:66
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


je suis @niezdecydowany
WR
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 9 lat
  • Postów:9
0
Kopiuj
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

edytowany 3x, ostatnio: WhiteRabbit

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.