[JAVA] Runnable meerdere methods

Pagina: 1
Acties:

  • RomeoJ
  • Registratie: Mei 2003
  • Niet online

RomeoJ

Matched: (.*)

Topicstarter
Ik ben momenteel bezig met een klein projectje voor mezelf. Nu heb ik wel al wat Java ervaring opgedaan, maar er is iets waar ik niet uitkom, misschien ook omdat ik de essentie er van dan niet snap.

Mijn probleem is dat ik meerdere classes heb gemaakt met de implementatie Runnable, waardoor ik die class dus kan Threaden als ik het uit wil voeren. So far so good..
Nu wil ik dus in deze class meerdere methods aanmaken, maar deze zijn dan niet Threadable, of beter gezegd ik krijg ze met geen mogelijkheid Threadable, het enige wat threaded wordt is de method run, lijkt het.

Ik krijg het uiteindelijk wel met een omweg aan de praat, door een nieuwe setter te maken die de naam van een method in een String stopt, en vervolgens via een lullig if-statement uitleest welke method de run moet uitvoeren.
Dit vind ik persoonlijk best smerig, en is niet goed onderhoudbaar, en tevens niet fail-safe, aangezien het een simpele String betreft. 8)7
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class RunClass implements Runnable
{
    private String method;


    public RunClass()
    {
    }


    public void setMethod(String method)
    {
        this.method = method;
    }


    public void run()
    {
        if(method.equals("TestMethod"))
        {
            this.TestMethod();
        }
        else if(method.equals("OtherMethod"))
        {
            this.OtherMethod();
        }
    }


    private void TestMethod()
    {
        System.out.println("Test 1");
    }


    private void OtherMethod()
    {
        System.out.println("Test 2");
    }
}


De versimpelde versie van mijn huidige class. Let wel dat dit slechts ter indicatie is, en niet de class in kwestie. Heb dus verschillende dingen geprobeerd, ook extends Thread, maar dit bleek de enige effectieve oplossing. :/

Graag wil ik dit dus beter doen, maar heb na verscheidene zoekopdrachten in F1 en Google geen bruikbare oplossing langs zien komen. De boeken die ik over Java bezit komen hier ook niet op terug en bieden dus ook geen oplossing. :*)

Is hier een andere (lees: betere) oplossing voor?

You only need two tools in life: WD-40 and Duct-Tape, if it doesn't move and it should, use the WD-40. If it does move and it shouldn't, use the Tape.


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Waarom maak je niet gewoon meerdere classes die Runnable implementeren :?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • RomeoJ
  • Registratie: Mei 2003
  • Niet online

RomeoJ

Matched: (.*)

Topicstarter
Dan zou ik van elke method een andere class moeten maken, dat zou een beetje uit de hand lopen.

Dit voorbeeld was slechts ter illustratie met twee methods, maar in de praktijk heb ik per class (5) ongeveer 10 á 20 methods, dat zou dus 50 tot 100 classes opleveren.
Als laatste weg is dat misschien een optie, maar ik ben gewoon benieuwd hoe ik mijn probleem op een efficiente en nette manier kan tackelen.

Het gaat mij niet alleen om een omweg te verzinnen, want dat was ook als eerste wat in mij opkwam om aparte classes aan te maken, maar ik ben gewoon leergierig en wil weten hoe dit door de professional opgelost wordt.

Maar; toch bedankt voor je inbreng!! Als laatste weg is dat zeker te overwegen, maar dan zou ik wel methods moeten omgooien. :Y)

You only need two tools in life: WD-40 and Duct-Tape, if it doesn't move and it should, use the WD-40. If it does move and it shouldn't, use the Tape.


  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 10:45

Salandur

Software Engineer

Dan is de door jouw gemaakte oplossing een goede manier om het te doen.

Ik vraag me echter af wat je precies probeert te bereiken?

Assumptions are the mother of all fuck ups | iRacing Profiel


  • pedorus
  • Registratie: Januari 2008
  • Niet online
R3dn3ck schreef op donderdag 11 december 2008 @ 14:17:
Dan zou ik van elke method een andere class moeten maken, dat zou een beetje uit de hand lopen.

Dit voorbeeld was slechts ter illustratie met twee methods, maar in de praktijk heb ik per class (5) ongeveer 10 á 20 methods, dat zou dus 50 tot 100 classes opleveren.
En het probleem is? Dat doe je bij events in java toch vaak ook al (Anonymous inner classes)?
Je kan ze gewoon nesten voor de overzichtelijkheid. Vergelijk bijvoorbeeld:
Java:
1
2
3
RunClass method1 = new RunClass()
method1.setMethod("method1");
...

met iets als:
Java:
1
Runnable method1 = Methods.createMethod1();

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Zyppora
  • Registratie: December 2005
  • Laatst online: 12-09 10:59

Zyppora

155/50 Warlock

Het enige wat hier volgens mij mis kan gaan, is dat de variabele method uitgevoerd wordt op het moment nadat de thread regel 19 uitgevoerd heeft, en voor regel 21. En zelfs dan kan je niet spreken van een thread-unsafe situatie. Je kunt dit oplossen door met semaforen te werken, of (dacht ik) de variabele method als synchronized te declareren.

Laat iemand mij alsjeblieft corrigeren als ik het mis heb, daar leer ook ik wat van :)

[ Voor 0% gewijzigd door Zyppora op 11-12-2008 17:08 . Reden: dat ding heet semafoor |:( ]

Phenom II X4 945 \\ 8GB DDR3 \\ Crosshair IV Formula \\ R9 290


  • RomeoJ
  • Registratie: Mei 2003
  • Niet online

RomeoJ

Matched: (.*)

Topicstarter
Wat ik wil bereiken is heel simpel; betere onderhoudbaarheid, dacht namelijk dat er wel een betere oplossing voor zou zijn.

Ik wil namelijk gewoon de method aanroepen die ik wil gebruiken, zonder daarbij een if-statement te gebruiken om uit te lezen wat ik wil, want als er methodes bij komen dan moet ik die if-statement aanpassen, en zo is het totaalplaatje een beetje minder onderhoudbaar dan dat je direct de method kan aanroepen (zoals een "normale" class betaamt).

//Edit:
@pedorus: hmm, ja innerclasses zouden inderdaad ook mogelijk zijn, dat is denk ik wel een heel strak idee. Ik gebruik inderdaad Anonymous Inner Classes voor de Events.
Ik zou dan natuurlijk een "normale" class aan kunnen maken, en dan bij de EventHandler een runnable innerclass die de betreffende methode uit de "normale" class aanroept.
Puik plan, zover was ik nog niet, maar dat is denk ik de beste oplossing!! :*)

[ Voor 35% gewijzigd door RomeoJ op 11-12-2008 15:13 ]

You only need two tools in life: WD-40 and Duct-Tape, if it doesn't move and it should, use the WD-40. If it does move and it shouldn't, use the Tape.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:42
metaforen
Ik wist niet dat die dingen zo heetten :Y)

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 25-09 16:59

Janoz

Moderator Devschuur®

!litemod

Je hoeft je class niet runnable te maken om methoden in een apparte thread uit te voeren.

Java:
1
2
3
4
5
6
        final RunClass runClass = new RunClass();
        new Thread(new Runnable(){
            public void run() {
                runClass.otherMethod();
            }
        }).start();

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 10:55
Je hebt dus een klein projectje waarin 50-100 methods in een thread wil kunnen uitvoeren. Je zou je ook af kunnen vragen of dit allemaal wel nodig is?

Roomba E5 te koop


  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 00:03

Jrz

––––––––––––

getClass().getMethod(methodName).invoke(this);

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


  • DaCoTa
  • Registratie: April 2002
  • Laatst online: 25-09 22:17
Jrz schreef op donderdag 11 december 2008 @ 15:26:
getClass().getMethod(methodName).invoke(this);
In 99% van de gevallen is reflection een bad idea. Grof gezegd, alleen als je compilers of frameworks maakt, zou je het nodig kunnen hebben.

  • RomeoJ
  • Registratie: Mei 2003
  • Niet online

RomeoJ

Matched: (.*)

Topicstarter
@Janoz; ik heb het nu inderdaad precies zo opgelost, met bijdrage van pedorus kwam ik tot het idee om dat zo op te lossen, werkte perfect zie ik.
Toch voel ik mezelf redelijk dom, want ik gebruik soortgelijke aanpak ook bij EventHandlers. Weer niet goed nagedacht. |:(

@sig69; wij zullen wel een andere kijk op "een klein projectje" hebben. ;)

@Jrz; zo zou het inderdaad ook nog kunnen, om die if-statement te killen.

You only need two tools in life: WD-40 and Duct-Tape, if it doesn't move and it should, use the WD-40. If it does move and it shouldn't, use the Tape.

Pagina: 1