Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Vajaks loogilist seletust märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
kevin3220
HV vaatleja

liitunud: 31.10.2011




sõnum 18.02.2014 21:58:22 Vajaks loogilist seletust vasta tsitaadiga

Tere,



Selline loll küsimus, et mul on väike koodi jupp, millest ma ei saa aru ;(

public synchronized void start(){

               running=true;
               thread=new Thread(this);
               thread.start();
   };
        public void run(){
      System.out.println("Teema alustatud!");
      
   }

Probleem siis seisneb, et mida tähendab 1) synchronized ?
2) Mida see this otseselt teeb?
Kui asendasin, this null-iga siis, kõik töötas nagu peaks, aga ei käivitatud run() meetodit. Et probleem siis seisneb selles, mida this teeb. Ma saan aru nagu ta tähendab seal, et jooksuta seda klassi, aga kui selle asemele kirjutada Game(), mis on selle klassi nimi, annab Java errori ?
Miks, ma oleksin väga tänulik kui keegi saaks eesti keeles seda mulle seletada, sest ma vaatasin eesti keelset jaava sõnastiku jne. Aga aru ma ei saa...


Tänud, ette!
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 19.02.2014 09:42:42 Re: Vajaks loogilist seletust vasta tsitaadiga

kevin3220 kirjutas:
Tere,



Selline loll küsimus, et mul on väike koodi jupp, millest ma ei saa aru ;(

java:
  1. public synchronized void start(){
  2.     running=true;
  3.     thread=new Thread(this);
  4.     thread.start();
  5. }
  6.  
  7. public void run(){
  8.     System.out.println("Teema alustatud!");
  9. }
  10.  

Probleem siis seisneb, et mida tähendab 1) synchronized ?
2) Mida see this otseselt teeb?
Kui asendasin, this null-iga siis, kõik töötas nagu peaks, aga ei käivitatud run() meetodit. Et probleem siis seisneb selles, mida this teeb. Ma saan aru nagu ta tähendab seal, et jooksuta seda klassi, aga kui selle asemele kirjutada Game(), mis on selle klassi nimi, annab Java errori ?
Miks, ma oleksin väga tänulik kui keegi saaks eesti keeles seda mulle seletada, sest ma vaatasin eesti keelset jaava sõnastiku jne. Aga aru ma ei saa...


Tänud, ette!
1) Synchronized on võtmesõna, mis märgistab meetodi ära selliselt, et seda ei saaks mitu korda paralleelselt käivitada. Oluline on see siis, kui su programmil on mitu paralleelselt jooksvat lõime (inglisekeelne märksõna multithreading), mis kasutavad ühiseid ressursse. Tihti on oluline, et ligipääs neile oleks järjestikune, mitte paralleelne, seega märgistatakse kriitilised koodilõigud synchronized võtmesõnaga. Sel juhul kui üks lõim käivitab meetodi ja järgmine soovib sama meetodit käivitada, siis ta peab ootama, kuni eelmine lõim on selle meetodi läbinud enne, kui tal alustada lubatakse. Multithreading kui selline on üks suur ja keeruline teema, millega on väga kerge endal jalga kahuriga otsast ära lasta, seega parem ei tasuks seda torkida enne, kui sa väga täpselt tead, mida sa teed.

2) This antud kontekstis tähendab sama, mis this igal pool mujal, ehk siis viitab käesolevale objektile. Ilmselt on seda näite alusel natuke parem seletada, täiendasin su koodi umbkaudu nagu sa ilmselt seda ise ette kujutasid:
java:
  1. public class GameLauncher {
  2.     public static void main(String[] args) {
  3.         Game m2ng = new Game();
  4.         m2ng.start();
  5.     }
  6. }
  7.  
  8. class Game extends Thread {
  9.    
  10.     public synchronized void start(){
  11.         running=true;
  12.         thread=new Thread(this);
  13.         thread.start();
  14.     };
  15.     public void run(){
  16.         System.out.println("Teema alustatud!");
  17.     }
  18.    
  19. }

Sellises koodijupis "this" klassi Game sees viitab talle iseendale, konkreetsemalt, kui ma kutsun välja meetodi m2ng.start(), siis selle meetodi sees this tähendab konkreetselt seda m2ng objekti.

Miks sul ta this asemel Game() variandis ei töötanud .. ? Kas sa kirjutasidki ainult Game() või ikka new Game() nagu vaja on? Abiks oleks ka veateade siia kopeerida, "java error" ütleb ilma selgeltnägija kristallkuulita paraku väga vähe.

PS. Thread programmeerimises ei ole "teema" vaid "lõim" icon_smile.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
kevin3220
HV vaatleja

liitunud: 31.10.2011




sõnum 19.02.2014 17:59:47 Re: Vajaks loogilist seletust vasta tsitaadiga

Fukiku kirjutas:
kevin3220 kirjutas:
Tere,



Selline loll küsimus, et mul on väike koodi jupp, millest ma ei saa aru ;(

java:
  1. public synchronized void start(){
  2.     running=true;
  3.     thread=new Thread(this);
  4.     thread.start();
  5. }
  6.  
  7. public void run(){
  8.     System.out.println("Teema alustatud!");
  9. }
  10.  

Probleem siis seisneb, et mida tähendab 1) synchronized ?
2) Mida see this otseselt teeb?
Kui asendasin, this null-iga siis, kõik töötas nagu peaks, aga ei käivitatud run() meetodit. Et probleem siis seisneb selles, mida this teeb. Ma saan aru nagu ta tähendab seal, et jooksuta seda klassi, aga kui selle asemele kirjutada Game(), mis on selle klassi nimi, annab Java errori ?
Miks, ma oleksin väga tänulik kui keegi saaks eesti keeles seda mulle seletada, sest ma vaatasin eesti keelset jaava sõnastiku jne. Aga aru ma ei saa...


Tänud, ette!
1) Synchronized on võtmesõna, mis märgistab meetodi ära selliselt, et seda ei saaks mitu korda paralleelselt käivitada. Oluline on see siis, kui su programmil on mitu paralleelselt jooksvat lõime (inglisekeelne märksõna multithreading), mis kasutavad ühiseid ressursse. Tihti on oluline, et ligipääs neile oleks järjestikune, mitte paralleelne, seega märgistatakse kriitilised koodilõigud synchronized võtmesõnaga. Sel juhul kui üks lõim käivitab meetodi ja järgmine soovib sama meetodit käivitada, siis ta peab ootama, kuni eelmine lõim on selle meetodi läbinud enne, kui tal alustada lubatakse. Multithreading kui selline on üks suur ja keeruline teema, millega on väga kerge endal jalga kahuriga otsast ära lasta, seega parem ei tasuks seda torkida enne, kui sa väga täpselt tead, mida sa teed.

2) This antud kontekstis tähendab sama, mis this igal pool mujal, ehk siis viitab käesolevale objektile. Ilmselt on seda näite alusel natuke parem seletada, täiendasin su koodi umbkaudu nagu sa ilmselt seda ise ette kujutasid:
java:
  1. public class GameLauncher {
  2.     public static void main(String[] args) {
  3.         Game m2ng = new Game();
  4.         m2ng.start();
  5.     }
  6. }
  7.  
  8. class Game extends Thread {
  9.    
  10.     public synchronized void start(){
  11.         running=true;
  12.         thread=new Thread(this);
  13.         thread.start();
  14.     };
  15.     public void run(){
  16.         System.out.println("Teema alustatud!");
  17.     }
  18.    
  19. }

Sellises koodijupis "this" klassi Game sees viitab talle iseendale, konkreetsemalt, kui ma kutsun välja meetodi m2ng.start(), siis selle meetodi sees this tähendab konkreetselt seda m2ng objekti.

Miks sul ta this asemel Game() variandis ei töötanud .. ? Kas sa kirjutasidki ainult Game() või ikka new Game() nagu vaja on? Abiks oleks ka veateade siia kopeerida, "java error" ütleb ilma selgeltnägija kristallkuulita paraku väga vähe.

PS. Thread programmeerimises ei ole "teema" vaid "lõim" icon_smile.gif


Suured suured suured tänud sulle icon_wink.gif Aitasid mind hädast välja, leiduks sinu suguseid internetis veelgi...
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Vajaks loogilist seletust
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.