W katalogu
structures znajduje się implementacja kolejki priorytetowej bazującej na kopcach parowalnych. Włożenie elementu do kolejki zwraca referencję na ten element, tak aby później za pomocą tej referencji można było zmniejszać jego priorytet.
Arena i przykładowi gracze. Uwaga! W interfejsie IPlayer pojawiła się nowa metoda:
która jest wołana po zakończeniu sekwencji rozgrywek z danym przeciwnikiem (tj. przy zmianie przeciwnika). Metoda ta została dodana po to, aby nie trzeba było tworzyć nowej instancji gracza na każda kolejną serię rozgrywek.
Należy napisać klasę implementującą interfejs:
public interface IChannel<T> {
public T get();
public void put(T val);
}
|
Metoda:
służy do wkłdania wartości do kanału, a matoda:
do odebrania wartości z kanału. Wątek, który chce włożyć wartość do kanału ma być blokowany tak długo, aż pojawi się wątek chcący odebrać wartość z kanału; i odwrotnie - wątek chcący odebrać wartość z kanału ma być blokowany tak długo, aż pojawi się wątek wkładający wartość do kanału. Należy uwzględnić scenariusz, w którym wiele wątków chce wkładać/odbierać wartości z kanału. Należy zwrócić uwagę na to, aby żaden wątek nie mógł zostać zagłodzony.
Zadanie bonusowe (z bardzo dużym bonusem) polega na napisaniu dodatkowej klasy implementującej powyższy interfejs:
public class ParallelChannel<T> implements IChannel<T> {
public ParallelChannel(IChannel<T> channelA, IChannel<T> channelB) {
// ...
}
public T get() {
// ...
}
public void put() {
// ...
}
}
|
która w konstruktorze będzie przyjmowała dwa kanały i tworzyła z nich kanał równoległy. Wątki chcące włożyć/odebrać wartość do takiego równoległego kanału mają mieć możliwość włożenia/odebrania wartości do dowolnego z dwóch kanałów podanych w konstruktorze. Należy zwrócić szczególną uwagę na kwestię niezagładzania wątków i bycia fair (równomiernego obsługiwania czekających wątków). W implementacji można założyć, że interfejs:
implementowany jest tylko przez dwie zdefiniowane przez nas klasy.
Przykładowa
implementacja automatu niedeterministycznego.
Nietestowana implementacja
2-3 drzew bez równoważenia.
Notka na temat różnych typów generatorów spotykanych w językach programowania wraz z przykładowymi implementacjami w (starej) Javie. Kod źródłowy interfejsów i przykładowych klas znajduje się w katalogu
utp .