s [ Pobierz całość w formacie PDF ]

Thread.currentThread.getName)
func()
}
})
() => future.get()
}
}
Tym razem implementacja ThreadPoolStrategy tworzy pul w tków, korzystaj c z biblio-
teki java.util.concurrent.Executors. Liczba w tków w puli odpowiada liczbie dost p-
nych procesorów. Metoda execute pobiera przekazan jej funkcj i tworzy anonimow
instancj Callable. Interfejs Callable s u y w a nie do przekazywania zada do wy-
konania przez w tki z puli. Zwracany jest obiekt typu Future, dzi ki któremu jest mo li-
we okre lenie, czy praca zosta a ju wykonana. Ostatnia linia execute zwraca anonimowe
domkni cie, które wywo a metod get na obiekcie future. To wywo anie zablokuje pro-
gram do momentu, a oryginalna funkcja zako czy dzia anie i zwróci wynik. Za ka dym
razem, gdy wewn trz Callable jest wykonywana funkcja, wypisana zostanie informacja
o tym, który w tek za ni odpowiada. Wypróbujmy nasz kod w sesji REPL:
scala> implicit val ts = ThreadPoolStrategy
ts: ThreadStrategy.ThreadPoolStrategy.type = ...
scala> val x = new Matrix(Array(Array(1,2,3), Array(4,5,6)))
x: library.Matrix =
Kup ksi k Poleć ksi k
5.3. Parametry domniemane i domy lne 129
Macierz
|1.0 | 2.0 | 3.0|
|4.0 | 5.0 | 6.0|
scala> val y = new Matrix(Array(Array(1), Array(1), Array(1)))
y: library.Matrix =
Macierz
|1.0|
|1.0|
|1.0|
scala> MatrixUtils.multiply(x,y)
Wykonanie funkcji w w tku: pool-2-thread-1
Wykonanie funkcji w w tku: pool-2-thread-2
res0: library.Matrix =
Macierz
|6.0|
|15.0|
W pierwszej linii tworzymy strategi ThreadPoolStrategy i oznaczamy j jako implicit.
Zmienne x i y to macierze o wymiarach 2 3 i 3 1. Metoda MatrixService.multiply
wypisuje teraz dwie linie, co oznacza, e obliczenia s wykonywane w ró nych w tkach.
Wynikowa macierz zawiera poprawne wyniki, tak samo jak wcze niej.
A co by si sta o, gdyby my chcieli zapewni domy ln strategi w tków dla u yt-
kowników biblioteki, któr mogliby jednak nadpisa wedle potrzeb? Mo emy skorzysta
z mechanizmu parametrów domy lnych. Parametr domy lny zostanie u yty, gdy w za-
kresie domniemanym nie b dzie dost pna odpowiednia warto , zatem u ytkownicy b d
mogli nadpisa zakres domy lny, importuj c lub tworz c w asn strategi ThreadStrategy.
U ytkownicy mog tak e przes oni zachowanie pojedynczej metody, jawnie przekazuj c
ThreadStrategy. Zmie my sygnatur metody MatrixService.multiply:
def multiply(a: Matrix, b: Matrix)(
implicit threading: ThreadStrategy = SameThreadStrategy
) : Matrix = {
...
}
Metoda multiply za domy ln strategi uznaje teraz SameThreadStrategy. Korzystaj c
z biblioteki, nie musimy ju okre la w asnej strategii:
scala> val x = new Matrix(Array(Array(1,2,3), Array(4,5,6)))
x: library.Matrix =
Macierz
|1.0 | 2.0 | 3.0|
|4.0 | 5.0 | 6.0|
scala> val y = new Matrix(Array(Array(1), Array(1), Array(1)))
y: library.Matrix =
Macierz
|1.0|
|1.0|
|1.0|
scala> MatrixService.multiply(x,y)
res0: library.Matrix =
Kup ksi k Poleć ksi k
130 ROZDZIA 5. Domniemane warto ci i widoki podstaw ekspresywnego kodu
Macierz
|6.0|
|15.0|
Inaczej ni w przypadku zwyk ych parametrów domy lnych, domniemana lista parame-
trów z warto ciami domy lnymi nie musi by oznaczona dodatkowymi nawiasami (). Ele-
gancja parametrów domniemanych zosta a po czona z u yteczno ci parametrów do-
my lnych. Nadal mo emy normalnie korzysta z parametrów domniemanych:
scala> implicit val ts = ThreadPoolStrategy
ts: ThreadStrategy.ThreadPoolStrategy.type = ...
scala> MatrixUtils.multiply(x,y)
Wykonanie funkcji w w tku: pool-2-thread-1
Wykonanie funkcji w w tku: pool-2-thread-2
res1: library.Matrix =
Macierz
|6.0|
|15.0|
Pierwsza linia tworzy w sposób domniemany dost pn strategi w tków. Od tej chwili
wywo anie MatrixService.multiply b dzie stosowa o strategi ThreadPoolStrategy.
U ytkownicy us ugi MatrixService mog dzi ki temu sami decydowa , kiedy zrównolegla
wykonywane przez ni obliczenia. Mog dostarczy domniemany obiekt strategii w danym
zakresie lub po prostu wywo a metod z odpowiednim parametrem ThreadStrategy.
Technika tworzenia domniemanej warto ci w zakresie obliczeniowym to przejaw
wzorca Strategia u ytego w odpowiednim miejscu i w odpowiedni sposób. Wzorzec ten
ma zastosowanie wtedy, gdy fragment kodu musi wykona pewn operacj , lecz pewne
elementy zachowania   strategia wykonania  mog zosta zmienione. Przyk adem
takiego zachowania jest obiekt ThreadPoolStrategy przekazywany do metod biblioteki
MatrixUtils. Ta sama strategia mo e zosta wykorzystana w wielu innych miejscach [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • srebro19.xlx.pl