plik


ÿþWspóBbie\no[ Programowanie wspóBbie\ne: " techniki i notacje programistyczne sBu\ce do wyra\enia potencjalnej równolegBo[ci oraz do rozwizywania zagadnieD zwizanych z problemami synchronizacyjnymi i komunikacyjnymi " pozwala zajmowa si równolegBo[ci bez wdawania si w szczegóBy implementacyjne Historia: Zastosowania wspóBbie\no[ci: " przyspieszenie wykonywania obliczeD " lepsze wykorzystanie zasobów (sprztu) " umo\liwienie wspóBpracy wielu u\ytkowników " udostpnienie stylu programowania uBatwiajcego tworzenie du\ych, przejrzy[cie zorganizowanych programów Wielowtkowo[ " Wielowtkowo[ to cecha systemu operacyjnego, dziki której w ramach jednego procesu mo\e si wykonywa wiele wtków. Nowe wtki to kolejne cigi instrukcji wykonywane oddzielnie. " Wszystkie wtki tego samego procesu wspóBdziel kod programu i dane. W systemach nieobsBugujcych wielowtkowo[ci pojcia procesu i wtku uto\samiaj si. Wtki " W programowaniu sekwencyjnym ka\dy program ma pocztek, sekwencje instrukcji do wykonania i koniec. W ka\dym momencie dziaBania programu mo\na wskaza miejsce, w którym znajduje si sterowanie. Taki program stanowi pojedynczy, sekwencyjny przepByw sterowania. " Program wielowtkowy skBada si z wielu przepBywów sterowania, wtków, z których ka\dy ma pocztek, sekwencje instrukcji i koniec. " Wtek jest to obiekt systemu operacyjnego stanowicy wydzielon cz[ kodu procesu (uruchomionej aplikacji) i ubiegajcy si o czas procesora. Jest to jednostka wykonawcza w obrbie jednego procesu, bdca kolejnym cigiem instrukcji wykonywanym w obrbie tych samych danych (w tej samej przestrzeni adresowej). " W programie wielowtkowym wykonywanym na maszynie wieloprocesorowej wtki s wykonywane w tym samym czasie na ró\nych procesorach, wspóBbie\nie. Na komputerach jednoprocesorowych wykonanie programów wielowtkowych jest tylko emulowane. Emulacja ta polega na naprzemiennym przydzielaniu czasu procesora poszczególnym wtkom w zale\no[ci od priorytetu wtku. Zastosowania wielowtkowo[ci: " umo\liwienie programowi wykonywania ró\nych czynno[ci równocze[nie " synchronizacja dostpu do komponentów " udostpnienie stylu programowania uBatwiajcego tworzenie du\ych, przejrzy[cie zorganizowanych programów " przyspieszenie wykonywania obliczeD Zastosowania wielowtkowo[ci: " umo\liwienie programowi wykonywania ró\nych czynno[ci równocze[nie Zastosowania wielowtkowo[ci: " synchronizacja dostpu do komponentów Zastosowania wielowtkowo[ci: " przyspieszenie wykonywania obliczeD Problem sortowania (sortowanie przez wybór wspomagane zamian): wersja 1: for nr1 := 1 to MAX - 1 do for nr2 := nr1 + 1 to MAX do if t[ nr2 ] < t[ nr1 ] then begin pom := t[ nr1 ]; t[ nr1 ] := t[ nr2 ]; t[ nr2 ] := pom; zBo\ono[ end obliczeniowa ok. wersja 2: n2 2 for nr1 := 1 to MAX - 1 do begin nrMin := nr1; elMin := t[ nr1 ]; for nr2 := nr1 + 1 to MAX do if t[ nr2 ] < elMin then begin nrMin := nr2; elMin := t[ nr2 ]; end; t[ nrMin ] := t[ nr1 ]; t[ nr1 ] := elMin; end Rozwizanie wspóBbie\ne (idea): 1 2 3 ... n - podziaB tablicy na poBowy n n 1 2 3 1 2 3 2 2 - sortowanie poBówek - Bczenie poBówek 1 2 3 ... n Rozwizanie wspóBbie\ne (realizacja): A. sekwencyjna: 2 2 n n ëø öø ëø öø ìø ÷ø ìø ÷ø n2 2 2 íø øø íø øø + + n = + n 2 2 4 B. równolegBa: a. dwa procesory 2 n ëø öø ìø ÷ø n2 2 íø øø + n = + n 2 8 b. jeden procesor (podziaB czasu) 2 2 n n ëø öø ëø öø ìø ÷ø ìø ÷ø n2 2 2 íø øø íø øø + + n + Tp = + n + Tp 2 2 4 gdzie Tp jest sumarycznym czasem przeBczania procesów sortowania Liczba porównaD: n2 n2 n2 n2 + n + n + n + Tp n 2 4 8 4 20 200 120 70 ? 100 5000 2600 1350 ? 200 20000 10200 5200 ? 500 125000 63000 31750 ? 1000 500000 251000 126000 ? Problemy: " Jak teoretyczna liczba porównaD przekBada si na czas obliczeD? " Jak du\y jest koszt przeBczania wtków w realizacji jednoprocesorowej? " Czy jest znaczca ró\nica czasów dla systemów Windows XP oraz Vista? Wielordzeniowo[ a hiperwtkowo[ " hiperwtkowo[ (Hyper-Threading Technology)  nazwa technologii opracowanej przez firm Intel dla procesorów Pentium 4 i Pentium EE, w której dwa niezale\ne wtki mog korzysta z tych samych jednostek wykonawczych procesora, je\eli jeden z nich ulega  przeczekaniu o maksymalny teoretyczny do osignicia zysk wydajno[ci szacowany jest na 30%, praktycznie trudno jest osign zysk powy\ej 20% " dwurdzeniowo[  procesor posiada dwa niezale\nie pracujce rdzenie, przy czym oba rdzenie procesora maj dostp do wspólnej pamici podrcznej (Intel) o procesory dwurdzeniowe dziaBaj ok. 40% szybciej ni\ modele Pentium D Zastosowania wielowtkowo[ci (wyniki  czas obliczeD [s]): Jzyk Normalnie Równolegle Szeregowo Procesor System op. Java 17.7 4.7 8.9 Vista Pascal 24.7 6.4 12.4 Procesor dwurdzeniowy Java 17.7 4.6 8.7 WinXP Pascal 24.7 6.3 12.3 Java 35.5 12.5 15.1 Procesor dwuwtkowy Pascal 77.4 35.6 37.7 WinXP Java 35.7 15.6 15.1 Procesor jednowtkowy Pascal 77.3 39.0 38.9 Zastosowania wielowtkowo[ci (wnioski): Jzyk Normalnie Równolegle Szeregowo Procesor System op. Java 100% 26.6% 50.3% Vista Pascal 100% 25.9% 50.2% Procesor dwurdzeniowy Java 100% 26.0% 49.2% WinXP Pascal 100% 25.5% 49.8% Java 100% 35.2% 42.5% Procesor dwuwtkowy Pascal 100% 46.0% 48.7% WinXP Java 100% 43.7% 42.3% Procesor jednowtkowy Pascal 100% 50.5% 49.0% " Wyniki potwierdzaj rozwa\ania teoretyczne  rozwizania wspóBbie\ne s szybsze zarówno przy realizacji równolegBej, jak i szeregowej. " Koszt przeBczania wtków zale\y od jzyka: dla Javy jest nieco wikszy (20%) ni\ dla Pascala (8%) ze wzgldu na interpretacj kodu bajtowego " W obu systemach operacyjnych czas obliczeD jest praktycznie taki sam, ró\nica wynosi ok. 2% na niekorzy[ systemu Windows Vista " Zagadnienia dziedziczone z programowania wspóBbie\nego: " wzajemne wykluczanie " synchronizacja " wspóBdziaBanie Problemy: Narzdzia: " naruszenie integralno[ci danych " monitory " blokada wzajemna " sekcje krytyczne " zagBodzenie " muteksy " semafory Tworzenie wtku Wtek mo|na zdefiniowa na dwa sposoby: " jako podklas klasy Thread " implementujc interfejs Runnable Tworzenie wtku jako podklasy klasy Thread: 1) utworzenie klasy wtku z metod run() reprezentujc obliczenia realizowane przez wtek 2) utworzenie obiektu reprezentujcego wtek (jawnego lub roboczego) 3) skonfigurowanie wtku (nazwa, priorytet) 4) uruchomienie wtku metod start() klasy Thread 5) zakoDczenie pracy wtku: a) naturalne zakoDczenie pracy metody run() b) wymuszone za pomoc metody stop() lub interrupt() JBuilder - Filename = D:/Mar/Java/Watki3/src/watki3/Watki3.java Printed on 2 styczeD 2007 at 23:13 by UMB Page 1 of 1 1 package watki3 ; 2 3 class PingPong extends Thread 4 { String sBowo ; // co wypisac 5 int opóznienie ; // opóznienie 6 7 PingPong (String co, int czas ) 8 { 9 sBowo = co; 10 opóznienie = czas ; 11 } 12 13 public void run() 14 { 15 try 16 { for(;;) 17 { System .out.print ( sBowo + " "); 18 sleep ( opóznienie ); 19 } 20 } 21 catch (InterruptedException e ) 22 { return ; 23 } 24 } 25 } 26 27 public class Watki3 { 28 public static void main (String [] args ) 29 { 30 PingPong ping = new PingPong ("ping" , 66); 31 PingPong pong = new PingPong ("Pong" , 33); 32 ping .start (); 33 pong .start (); 34 } 35 } 36 /****************************************************************************** 37 ping Pong Pong ping Pong Pong ping Pong Pong ping Pong Pong ping Pong Pong ping 38 Pong Pong Pong ping Pong ping Pong Pong ping Pong Pong Pong ping Pong ping Pong 39 *******************************************************************************/ JBuilder - Filename = D:/Mar/Java/watki4/src/watki4/watki4.java Printed on 2 styczeD 2007 at 23:45 by UMB Page 1 of 1 1 package watki4 ; 2 3 class PingPong extends Thread 4 { String sBowo ; // co wypisac 5 int opóznienie ; // opóznienie 6 7 PingPong (String co, int czas ) 8 { 9 sBowo = co; 10 opóznienie = czas ; 11 } 12 13 public void run() 14 { 15 try 16 { while (true ) 17 { System .out.print ( sBowo + " "); 18 sleep ( opóznienie ); 19 } 20 } 21 catch (InterruptedException e ) 22 { return ; 23 } 24 } 25 } 26 27 public class watki4 { 28 public static void main (String [] args ) 29 { 30 new Thread (new PingPong ("ping" , 66)).start (); 31 new Thread (new PingPong ("Pong" , 33)).start (); 32 } 33 } 34 Tworzenie wtku jako implementacji interfejsu Runnable: 1) utworzenie klasy wtku z metod run() reprezentujc obliczenia realizowane przez wtek 2) utworzenie obiektu klasy Thread reprezentujcego wtek (jawnego lub roboczego) za pomoc konstruktora z parametrem typu klasy wtku 3) skonfigurowanie wtku (nazwa, priorytet) 4) uruchomienie wtku metod start() klasy Thread 5) zakoDczenie pracy wtku: a) naturalne zakoDczenie pracy metody run() b) wymuszone za pomoc metody stop() lub interrupt() JBuilder - Filename = D:/Mar/Java/Wtki1/src/wtki1/Wtki1.java Printed on 2 styczeD 2007 at 23:56 by UMB Page 1 of 2 1 package wtki1 ; 2 3 class Watek implements Runnable 4 { 5 String wysun = ""; 6 String nazwa ; 7 public Watek ( String str, int numer ) 8 { 9 nazwa = str; 10 for (int i = 1; i < numer ; i++) wysun = wysun + " " ; 11 } 12 public void run() 13 { 14 for (int i = 0; i < 4; i++) 15 { 16 System .out.println (wysun + i + " " + nazwa ); 17 try 18 { 19 Thread .sleep ((int)(Math .random () * 1000 )); 20 // Thread.sleep(1000); 21 } 22 catch (InterruptedException e) {} 23 } 24 System .out.println (wysun + nazwa + " koniec" ); 25 } 26 } 27 28 public class Wtki1 29 { 30 public static void main (String [] args ) throws Exception { 31 new Thread (new Watek ("Janek" , 1)).start (); 32 new Thread (new Watek ("Magda" , 2)).start (); 33 new Thread (new Watek ("Wacek" , 3)).start (); 34 new Thread (new Watek ("Ola" , 4)).start (); 35 } 36 } 37 38 39 JBuilder - Filename = D:/Mar/Java/Wtki1/src/wtki1/Wtki1.java Printed on 2 styczeD 2007 at 23:56 by UMB Page 2 of 2 40 /****************************************************************************** 41 0 Janek 42 0 Wacek 43 0 Magda 44 0 Ola 45 1 Ola 46 1 Wacek 47 1 Magda 48 1 Janek 49 2 Ola 50 3 Ola 51 2 Wacek 52 3 Wacek 53 Wacek koniec 54 2 Janek 55 2 Magda 56 Ola koniec 57 3 Magda 58 3 Janek 59 Magda koniec 60 Janek koniec 61 ******************************************************************************/ 62 JBuilder - Filename = D:/Mar/Java/Watki2/src/watki2/watki2.java Printed on 2 styczeD 2007 at 23:05 by UMB Page 1 of 3 1 package watki2 ; 2 3 class Watek implements Runnable 4 { 5 String wysun = ""; 6 String nazwa ; 7 public Watek ( String str, int numer ) 8 { 9 nazwa = str; 10 for (int i = 1; i < numer ; i++) wysun = wysun + " " ; 11 } 12 public void run() 13 { 14 for (int i = 0; i < 4; i++) 15 { 16 System .out.println (wysun + i + " " + nazwa ); 17 try 18 { 19 // Thread.sleep((int)(Math.random() * 1000)); 20 Thread .sleep (1000 ); 21 } 22 catch (InterruptedException e) {} 23 } 24 System .out.println (wysun + nazwa + " koniec" ); 25 } 26 } 27 28 public class watki2 29 { 30 public static void main (String [] args ) throws Exception { 31 Watek Janek = new Watek ("Janek" , 1); 32 Watek Magda = new Watek ("Magda" , 2); 33 Watek Wacek = new Watek ("Wacek" , 3); 34 Watek Ola = new Watek ("Ola" , 4); 35 Thread wJanek = new Thread (Janek ); 36 Thread wMagda = new Thread (Magda ); 37 Thread wWacek = new Thread (Wacek ); 38 Thread wOla = new Thread (Ola); 39 JBuilder - Filename = D:/Mar/Java/Watki2/src/watki2/watki2.java Printed on 2 styczeD 2007 at 23:05 by UMB Page 2 of 3 40 wJanek .setPriority (1); //1 .. 5 .. 10 41 wMagda .setPriority (3); //1 .. 5 .. 10 42 wWacek .setPriority (7); //1 .. 5 .. 10 43 wOla .setPriority (10); //1 .. 5 .. 10 44 wJanek .start (); 45 wMagda .start (); 46 wWacek .start (); 47 wOla .start (); 48 } 49 } 50 /******************** bez priorytetów *********************************** 51 0 Magda 52 0 Ola 53 0 Janek 54 0 Wacek 55 1 Magda 56 1 Ola 57 1 Janek 58 1 Wacek 59 2 Magda 60 2 Janek 61 2 Ola 62 2 Wacek 63 3 Magda 64 3 Ola 65 3 Wacek 66 3 Janek 67 Magda koniec 68 Wacek koniec 69 Ola koniec 70 Janek koniec 71 72 73 74 75 76 77 78 JBuilder - Filename = D:/Mar/Java/Watki2/src/watki2/watki2.java Printed on 2 styczeD 2007 at 23:05 by UMB Page 3 of 3 79 ******************** z priorytetami *********************************** 80 0 Wacek 81 0 Ola 82 0 Magda 83 0 Janek 84 1 Ola 85 1 Wacek 86 1 Magda 87 1 Janek 88 2 Ola 89 2 Wacek 90 2 Magda 91 2 Janek 92 3 Ola 93 3 Wacek 94 3 Magda 95 3 Janek 96 Ola koniec 97 Wacek koniec 98 Magda koniec 99 Janek koniec 100 ************************************************************************/ 101 Stany wtku " nowy wtek Thread mójWtek = new MojaKlasaWtku(); tworzy nowy wtek ale nie uruchamia go - pozostawia wtek w stanie "nowy wtek". Po wykonaniu konstruktora zostaje utworzony pusty obiekt Thread. {adne zasoby systemowe nie zostaBy jeszcze przydzielone dla tego wtku. Kiedy wtek znajduje si w tym stanie, mo|na jedynie wykona metod start(), uruchamiajc wtek, lub stop(), koDczc dziaBania wtku. Wszelkie próby wywoBania innych metod dla wtków w tym stanie powoduj wystpienie wyjtku IllegalThreadStateException. " wykonywany Thread mójWtek = new MojaKlasaWtku(); . . . . . . . . mójWtek.start(); Metoda start() tworzy zasoby systemowe potrzebne do wykonania wtku, przygotowuje wtek do uruchomienia, oraz woBa metod run(). Od tego momentu wtek jest w stanie "wykonywany". Nie oznacza to jednak automatycznie, |e wtek zostaje uruchomiony. Je|eli komputer ma tylko jeden procesor, niemo|liwe jest uruchomienie wielu wtków w tym samym momencie. Zrodowisko przetwarzania Javy implementuje system przydziaBu czasu procesora, który dzieli czas procesora midzy wszystkie wtki bdce w stanie "wykonywany". " niewykonywany Wtek przechodzi do stanu "niewykonywany", gdy zachodzi jedno z poni|szych zdarzeD: - wywoBano jego metod sleep(), - wywoBano jego metod suspend(), - wtek wykonuje swoj metod wait(), - wtek jest zablokowany przy operacji wej[cia/wyj[cia. Warunki, jakie musz by speBnione, aby nastpiB powrót do stanu "wykonywany": " je[li wtek u[piono (metoda sleep()), musi upByn okre[lona liczba milisekund, " je[li wtek zawieszono (metoda suspend()), inny wtek musi wywoBa metod resume() wtku, powodujc jego odwieszenie, " je[li wtek czeka na np. ustawienie warto[ci pewnej zmiennej, to obiekt, do którego nale|y ta zmienna, musi j zwolni, a nastpnie wywoBa metod notify() lub notifyAll(), " je[li wtek jest zablokowany przy operacjach wej[cia/wyj[cia, wtedy operacje te musz by zakoDczone. " zakoDczony Wtek mo|e zakoDczy dziaBanie z dwu powodów: " naturalnie zakoDczy swe dziaBanie " zostanie  zabity Wtek naturalnie koDczy swoje dziaBanie wtedy, gdy jego metoda run() koDczy si normalnie. Mo|na zakoDczy wtek w ka|dym momencie poprzez wywoBanie jego metody stop(). Metoda stop() generuje w wtku wyjtek ThreadDeath, sBu|cy do zabicia go. Oznacza to, |e wtek w takim przypadku zabijany jest asynchronicznie. Wtek zostaje zabity wtedy, gdy rzeczywi[cie odbierze wyjtek ThreadDeath. " sprawdzenie stanu wtku: Metoda isAlive() Wynikiem wykonania metody isAlive() jest warto[ true, gdy wtek zostaB uruchomiony a nie zostaB jeszcze zakoDczony. Gdy wynikiem wykonania metody isAlive() jest warto[ false oznacza to, |e wtek jest albo w stanie "nowy wtek" lub "zakoDczony". Gdy wynikiem jest warto[ true, to wtek jest albo w stanie "wykonywany" lub "niewykonywany". JBuilder - Filename = D:/Mar/Java/Sort1/src/sort1/Sort1.java Printed on 3 styczeD 2007 at 00:10 by UMB Page 1 of 1 1 package sort1 ; 2 import java .util .*; 3 4 public class Sort1 { 5 public static final int MAXP = 50000 ; 6 static int[] tab; 7 8 static void SortRun () 9 { int nr1, nr2, pom; 10 for(nr1=0; nr1<2*MAXP -1; nr1++) 11 for(nr2=nr1+1; nr2<2*MAXP ; nr2++) 12 if(tab[nr2]<tab[nr1]) 13 { pom = tab[nr2]; 14 tab[nr2] = tab[nr1]; 15 tab[nr1] = pom; 16 } 17 } 18 public static void main (String [] args ) 19 { 20 tab = new int[2*MAXP ]; 21 22 for( int nr=0; nr<tab.length ; nr++ ) 23 tab[ nr ] = (int)(Math .random ()*10000 ); 24 25 long t1 = new Date ().getTime (); 26 System .out.println ("Sortowanie ---> start" ); 27 28 SortRun (); 29 30 System .out.println ("Sortowanie ---> koniec" ); 31 long t2 = new Date ().getTime (); 32 System .out.println ("Czas obliczeD: " +(t2-t1)+"ms" ); 33 } 34 } 35 /****************************************************************************** 36 Sortowanie ---> start 37 Sortowanie ---> koniec 38 Czas obliczeD: 28375ms 39 ******************************************************************************/ JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:25 by UMB Page 1 of 3 1 package Sort ; 2 3 import java .util .*; 4 5 public class Sort { 6 public static final int MAXP = 50000 ; 7 static int[] tab; 8 static int[] tab1 ; 9 static int[] tab2 ; 10 public static int ile = 0; 11 12 static void Acz ( int[] tab1 , int[] tab2 , int[] tab ) 13 { int nr=0, 14 nr1=0, 15 nr2=0; 16 17 while ( nr1<tab1 .length & nr2<tab2 .length ) 18 tab[nr++] = tab1 [nr1] < tab2 [nr2] ? tab1 [nr1++] : tab2 [nr2++]; 19 20 if( nr1<nr2 ) System .arraycopy (tab1 , nr1, tab, nr, MAXP -nr1); 21 else System .arraycopy (tab2 , nr2, tab, nr, MAXP -nr2); 22 23 } 24 25 public static void main (String [] args ) 26 { 27 tab = new int[2*MAXP ]; 28 tab1 = new int[MAXP ]; 29 tab2 = new int[MAXP ]; 30 31 for( int nr=0; nr<tab.length ; nr++ ) 32 tab[ nr ] = (int)(Math .random ()*10000 ); 33 34 System .arraycopy (tab, 0, tab1 , 0, MAXP ); 35 System .arraycopy (tab, MAXP , tab2 , 0, MAXP ); 36 37 SortThread sort1 = new SortThread ("pierwszy" , tab1 ); 38 SortThread sort2 = new SortThread ("drugi" , tab2 ); 39 JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:25 by UMB Page 2 of 3 40 long t1 = new Date ().getTime (); 41 sort1 .start (); 42 sort2 .start (); 43 // sort1.run(); 44 // sort2.run(); 45 46 while ( ile < 2 ); 47 48 System .arraycopy (sort1 .tab, 0, tab1 , 0, MAXP ); 49 System .arraycopy (sort2 .tab, 0, tab2 , 0, MAXP ); 50 51 System .out.println ("Aczenie ---> start" ); 52 Acz ( tab1 , tab2 , tab ); 53 System .out.println ("Aczenie ---> koniec" ); 54 55 long t2 = new Date ().getTime (); 56 System .out.println ("Czas obliczeD: " +(t2-t1)+"ms" ); 57 58 } 59 } 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:25 by UMB Page 3 of 3 79 class SortThread extends Thread 80 { String nazwa ; 81 public int[] tab = new int[Sort .MAXP ]; 82 83 SortThread ( String s, int[] tab_ ) 84 { nazwa = s; 85 System .arraycopy (tab_ , 0, tab, 0, Sort .MAXP ); 86 } 87 88 public void run() 89 { int nr1, nr2, pom; 90 91 System .out.println ("Wtek \"" + nazwa + "\" ---> start" ); 92 for(nr1=0; nr1<Sort .MAXP -1; nr1++) 93 for(nr2=nr1+1; nr2<Sort .MAXP ; nr2++) 94 if(tab[nr2]<tab[nr1]) 95 { pom = tab[nr2]; 96 tab[nr2] = tab[nr1]; 97 tab[nr1] = pom; 98 } 99 Sort .ile++; 100 System .out.println ("Wtek \"" + nazwa + "\" ---> koniec" ); 101 } 102 } 103 /******************************************************************************* 104 Wtek "pierwszy" ---> start 105 Wtek "drugi" ---> start 106 Wtek "drugi" ---> koniec 107 Wtek "pierwszy" ---> koniec 108 Aczenie ---> start 109 Aczenie ---> koniec 110 Czas obliczeD: 19953ms 111 *******************************************************************************/ JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:17 by UMB Page 1 of 3 1 package Sort ; 2 3 import java .util .*; 4 5 public class Sort { 6 public static final int MAXP = 50000 ; 7 static int[] tab; 8 static int[] tab1 ; 9 static int[] tab2 ; 10 public static int ile = 0; 11 12 static void Acz ( int[] tab1 , int[] tab2 , int[] tab ) 13 { int nr=0, 14 nr1=0, 15 nr2=0; 16 17 while ( nr1<tab1 .length & nr2<tab2 .length ) 18 tab[nr++] = tab1 [nr1] < tab2 [nr2] ? tab1 [nr1++] : tab2 [nr2++]; 19 20 if( nr1<nr2 ) System .arraycopy (tab1 , nr1, tab, nr, MAXP -nr1); 21 else System .arraycopy (tab2 , nr2, tab, nr, MAXP -nr2); 22 23 } 24 25 public static void main (String [] args ) 26 { 27 tab = new int[2*MAXP ]; 28 tab1 = new int[MAXP ]; 29 tab2 = new int[MAXP ]; 30 31 for( int nr=0; nr<tab.length ; nr++ ) 32 tab[ nr ] = (int)(Math .random ()*10000 ); 33 34 System .arraycopy (tab, 0, tab1 , 0, MAXP ); 35 System .arraycopy (tab, MAXP , tab2 , 0, MAXP ); 36 37 SortThread sort1 = new SortThread ("pierwszy" , tab1 ); 38 SortThread sort2 = new SortThread ("drugi" , tab2 ); 39 JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:17 by UMB Page 2 of 3 40 long t1 = new Date ().getTime (); 41 // sort1.start(); 42 // sort2.start(); 43 sort1 .run(); 44 sort2 .run(); 45 46 while ( ile < 2 ); 47 48 System .arraycopy (sort1 .tab, 0, tab1 , 0, MAXP ); 49 System .arraycopy (sort2 .tab, 0, tab2 , 0, MAXP ); 50 51 System .out.println ("Aczenie ---> start" ); 52 Acz ( tab1 , tab2 , tab ); 53 System .out.println ("Aczenie ---> koniec" ); 54 55 long t2 = new Date ().getTime (); 56 System .out.println ("Czas obliczeD: " +(t2-t1)+"ms" ); 57 58 } 59 } 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 JBuilder - Filename = D:/Mar/Java/Sort/src/Sort/Sort.java Printed on 3 styczeD 2007 at 00:17 by UMB Page 3 of 3 79 class SortThread extends Thread 80 { String nazwa ; 81 public int[] tab = new int[Sort .MAXP ]; 82 83 SortThread ( String s, int[] tab_ ) 84 { nazwa = s; 85 System .arraycopy (tab_ , 0, tab, 0, Sort .MAXP ); 86 } 87 88 public void run() 89 { int nr1, nr2, pom; 90 91 System .out.println ("Wtek \"" + nazwa + "\" ---> start" ); 92 for(nr1=0; nr1<Sort .MAXP -1; nr1++) 93 for(nr2=nr1+1; nr2<Sort .MAXP ; nr2++) 94 if(tab[nr2]<tab[nr1]) 95 { pom = tab[nr2]; 96 tab[nr2] = tab[nr1]; 97 tab[nr1] = pom; 98 } 99 Sort .ile++; 100 System .out.println ("Wtek \"" + nazwa + "\" ---> koniec" ); 101 } 102 } 103 /******************************************************************************* 104 Wtek "pierwszy" ---> start 105 Wtek "pierwszy" ---> koniec 106 Wtek "drugi" ---> start 107 Wtek "drugi" ---> koniec 108 Aczenie ---> start 109 Aczenie ---> koniec 110 Czas obliczeD: 18031ms 111 *******************************************************************************/

Wyszukiwarka

Podobne podstrony:
wątki ceglane pśin
SO 05 Watki
watki
watki
opis watki (2)
Wątki mitologiczne w sztuce nowożytnej
opis watki
watki
Java watki
sołtys,systemy operacyjne, wątki
wyk watki mutexy
watki 2
wÄ…tki
watki

więcej podobnych podstron