miXer Skrevet 15. februar 2010 Del Skrevet 15. februar 2010 Heisann. Et lite spørsmål angående Threads i java. I C# kan vi lage en hvilken som helst metode å kjøre i en egen thread som dette: Thread t = new Thread(new ThreadStart(sakesak)); private void sakesak() { //do something } Sånn som jeg har forstått det så kan Threads i java bare starte run() metoder, altså ikke angi en hvilken som helst metode. Stemmer dette? Lenke til kommentar
quantum Skrevet 15. februar 2010 Del Skrevet 15. februar 2010 Heisann. Et lite spørsmål angående Threads i java. I C# kan vi lage en hvilken som helst metode å kjøre i en egen thread som dette: Thread t = new Thread(new ThreadStart(sakesak)); private void sakesak() { //do something } Sånn som jeg har forstått det så kan Threads i java bare starte run() metoder, altså ikke angi en hvilken som helst metode. Stemmer dette? Sånn omtrentlig. http://www.exampledepot.com/egs/java.lang/BasicThread.html run()-metoden kan kalle hvilke andre metoder den vil. Lenke til kommentar
steingrim Skrevet 15. februar 2010 Del Skrevet 15. februar 2010 Sånn som jeg har forstått det så kan Threads i java bare starte run() metoder, altså ikke angi en hvilken som helst metode. Stemmer dette? Det stemmer at Java mangler delegates, men at det er en litt rar tolkning av konsekvensen synes jeg. Det er jo ikke verre enn at du implementerer Runnable og kaller metoden din fra run(): public class MinKlasse implements Runnable { public void run() { sakesak() } private void sakesak() { // ... } } Og et annet sted: new Thread(new MinKlasse()) Lenke til kommentar
miXer Skrevet 15. februar 2010 Forfatter Del Skrevet 15. februar 2010 Sånn som jeg har forstått det så kan Threads i java bare starte run() metoder, altså ikke angi en hvilken som helst metode. Stemmer dette? Det stemmer at Java mangler delegates, men at det er en litt rar tolkning av konsekvensen synes jeg. Det er jo ikke verre enn at du implementerer Runnable og kaller metoden din fra run(): public class MinKlasse implements Runnable { public void run() { sakesak() } private void sakesak() { // ... } } Og et annet sted: new Thread(new MinKlasse()) Var det jeg tenkte meg ja. Neida, det er ikke værre enn at jeg implementerer Runnable, men det er veldig unødvendig. Blir en ekstra metode som igrunn ikke er nødvendig dersom delegates fantes i java. Men hva hvis jeg vil ha to kanskje flere tråder i samme programmet som starter forskjellige metoder. Hvordan gjør jeg det da? Kan jeg gi med et argument inn i run? Lenke til kommentar
quantum Skrevet 15. februar 2010 Del Skrevet 15. februar 2010 Men hva hvis jeg vil ha to kanskje flere tråder i samme programmet som starter forskjellige metoder. Hvordan gjør jeg det da? Kan jeg gi med et argument inn i run? Øh, da lager du ulike klasser med ulik implementasjon av run()-metoden da vettu. Lenke til kommentar
steingrim Skrevet 15. februar 2010 Del Skrevet 15. februar 2010 Men hva hvis jeg vil ha to kanskje flere tråder i samme programmet som starter forskjellige metoder. Hvordan gjør jeg det da? Kan jeg gi med et argument inn i run? Nei, Runnable er definert som public void run(), så den kan ikke ta argumenter. Om du vil ha argumenter har du ikke så mange andre valg enn å lage dine egne implementasjoner av Runnable og sende disse med i feks constructor eller set-metoder. Det er forresten ikke så uvanlig å bruke anonyme klasser som instanser av Runnable: new Thread(new Runnable() { public void run() { // ... } }).start(); Lenke til kommentar
quantum Skrevet 16. februar 2010 Del Skrevet 16. februar 2010 Fom. Java5 har vi fått Executors som hjelper oss med trådeksekvering. http://www.javalobby.org/java/forums/t16252.html Aner ikke om C# har noe tilsvarende. Lenke til kommentar
GeirGrusom Skrevet 16. februar 2010 Del Skrevet 16. februar 2010 .NET 4.0 får TPL (Task Parallel Library) Men per dags dato må en klare seg med Thread klassen og [delegate].BeginInvoke(). Når det gjelder Java sin løsning er den egentlig vel så grei som .NET sin. Lenke til kommentar
MailMan13 Skrevet 19. februar 2010 Del Skrevet 19. februar 2010 (endret) Lenge siden jeg kodet Java, men jeg mener det er mulig å imlpementere et interface og instansiere det i samme statement: (forbehold om at det er en stund siden jeg skrev slik kode selv) Thread t = new Thread( new Runnable(){ public void run() { sakesak(); } } ); t.start(); Kanskje ikke like estetisk som en C# delegate. (I denne sammenhengen er en Delegate forsåvidt bare en forenkling av ett interface med èn metode, slik at implementasjonen slipper å eksplisitt refere grensesnittet). Begge deler er fullgode Stragegy-implementasjoner. Endret 19. februar 2010 av MailMan13 Lenke til kommentar
GeirGrusom Skrevet 19. februar 2010 Del Skrevet 19. februar 2010 En delegate i C# kan inneholde mange funksjoner av lik type. Action my_action += () => { Console.WriteLine("Hello World!"); }; my_action += () => { Console.WriteLine("Hallo Verden!"); }; Så det er ikke helt det samme som et interface. Lenke til kommentar
MailMan13 Skrevet 19. februar 2010 Del Skrevet 19. februar 2010 (endret) Heldigvis for meg var påstanden kvalifisert med "I denne sammenhengen..." da Var det f.eks snakk om en Observer-implementasjon hadde denne forskjellen vært relevant. Endret 19. februar 2010 av MailMan13 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå