Witam wszystkich ponownie. Tym razem mam problem z wielowątkowym mnożeniem macierzy. Mianowicie, zrobiłem sobie już funkcję, która oblicza pojedynczy wpis w macierzy wynikowej. Jako że każdy element macierzy wynikowej można obliczyć niezależnie, w pętli wywołuje ExecutorService tyle razy ile jest obliczeń. ExecutorService przy tworzeniu przyjmuje określoną ilość wątków. Poniżej uproszczony kod. Problem w tym, że:
- Jak dam exec.shutdown() skąd mam wiedzieć kiedy wątki zakończą działanie? na razie dałem sleepa i jako tako działa. Ale może jest bardziej elegancka metoda.
- Mierzę czas wykonywania tak jak poniżej. Co dziwne, dla 1 albo 10 wątków czas jest prawie taki sam;/ Czemu tak się dzieje?
public class Main implements Runnable{
public static void main(String[] args){
Thread t = new Thread(new Main());
t.start();
}
public void run(){
Macierz m1, m2;
m1.init();
m2.init();
ExecutorService exec = Executors.newFixedThreadPool(10);
long start=System.currentTimeMillis();
for(int i=0;i<ileObliczen;i++){
exec.execute(new MnoznikMacierzy(parametry));
}
exec.shutdown();
while(!exec.isTerminated()) Thread.sleep(1);
long stop=System.currentTimeMillis(); -> Wypisanie tego czasu
}
Klasa macierz nie jest tutaj istotna, ale kolejna:
oczywiście zawiera wszelakie potrzebne dane przekazywane w konstruktorze
class MnoznikMacierzy implements Runnable{
public void run(){
for(int i=0; i< m.kolumn;i++)
out.macierz[wiersz][kolumna] += m.macierz[wiersz][i] * m1.macierz[i][kolumna];
}
}
Z góry dziękuje za odpowiedź
Co ciekawe, teraz sprawdziłem. Jeśli pomnoże macierze w pętli normalnie to czas jest 2x krótszy niż przy użyciu wątków.