Gå til innhold

Anbefalte innlegg

Skrevet

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?

Videoannonse
Annonse
Skrevet
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.

Skrevet
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())

Skrevet
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?

Skrevet
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.

Skrevet
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();

Skrevet

.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.

Skrevet (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 av MailMan13
Skrevet

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.

Skrevet (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 av MailMan13

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...