[java]Thread stopt niet, maar waarom?

Pagina: 1
Acties:
  • 371 views sinds 30-01-2008
  • Reageer

  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
ik heb deze code:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// "runner" of Threadmanager. net zoals je wilt :D
class Runlikehell
{

    private KnightRider kr;
    private Thread t;

    public Runlikehell()
    {
        kr= new KnightRider();
        t=new Thread(kr);

    }
    public void Start()
    {
        t.start(); // hier start t, werkt gewoon
    }
    public void stop()
    {
        t.interrupt();//werkt niet :(
        System.out.println("stopped"); //werkt gewoon
    }
}
 // frame
import java.awt.*;
import java.awt.event.*;

class KRFrame extends Frame
{
    private GridLayout z;
    private KRButton b1,b2;
    private Runlikehell r;

    public KRFrame()
    {
        BorderLayout g = new BorderLayout();
        setLayout(g);

        r = new Runlikehell();

        b1 = new KRButton("start");
        b2 = new KRButton("stop");

        add(b1, "North");
        add(b2, "South");
        setSize(200,200);
        show();

    }
    public Runlikehell getRunner()
    {
        return r;
    }
}

//knopjes met actionlistener
import java.awt.event.*;
import java.awt.*;

class KRButton extends Button implements ActionListener
{

    private Thread t;
    private Runlikehell r;

    KRButton(String s)
    {
        setLabel(s);

        addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {
        Container c = getParent();
        KRFrame kf = (KRFrame)c;
        r = kf.getRunner();

        if(getLabel().equals("start"))
        {
            r.Start();
        }

        if(getLabel().equals("stop"))
        {
            r.stop();
        }
    }
}


Ik snap alleen niet waarom t niet stopt als ik de stop() aanroep, de printout doetie wel, dus daar kan het niet aan liggen'

ik kan de thread dus wel starten, ik kan bij alle methodes en constructor alleen stopt t niet als ik daar opdracht toe geef (ook geen foutmelding)

weet iemand hoe ik dit kan fixen?

[ Voor 47% gewijzigd door Rinusch op 12-03-2003 20:01 . Reden: hele code igevoegd ]

... Life is what happens when you are busy planning other things...


Verwijderd

hoe roep je die stop aan met een button?

  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
Verwijderd schreef op 12 maart 2003 @ 19:45:
hoe roep je die stop aan met een button?
inderdaad
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
import java.awt.event.*;
import java.awt.*;

class KRButton extends Button implements ActionListener
{

    private Thread t;
    private Runlikehell r;

    KRButton(String s)
    {
        setLabel(s);

        addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)
    {
        Runlikehell r = new Runlikehell();

        if(getLabel().equals("start"))
        {
            r.Start();
        }

        if(getLabel().equals("stop"))
        {
            r.stop();
        }
    }
}

op deze wijze

... Life is what happens when you are busy planning other things...


Verwijderd

heb je ookde code van de andere classes
threat en knigtrider?

Verwijderd

het werkt waarschijnlijk allemaal correct, alleen ben je niet op zoek naar de functionaliteit van interrupt(), maar naar stop() of wait().

[ Voor 5% gewijzigd door Verwijderd op 12-03-2003 20:17 ]


  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
Verwijderd schreef op 12 maart 2003 @ 20:06:
heb je ookde code van de andere classes
threat en knigtrider?
Threat zit standaard in java
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
//knightrider
class KnightRider implements Runnable
{
    public boolean r=true; //runnen ja of nee
    Shuvvport sv;
    public int a;

    public void run()
    {
        while(r)
        {
            a=250;
            sv=new Shuvvport(1);
            //System.out.println("turd");
            try
            {
                Thread.sleep(a);
            }
            catch(InterruptedException e)
            {
            }
        }
    }
}

... Life is what happens when you are busy planning other things...


  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
Verwijderd schreef op 12 March 2003 @ 20:16:
het werkt waarschijnlijk allemaal correct, alleen ben je niet op zoek naar de functionaliteit van interrupt(), maar naar stop() of wait().
DOH wat dom van me, :D het werkt idd :D

dit topic kan dus dicht O-)

... Life is what happens when you are busy planning other things...


Verwijderd

http://java.sun.com/j2se/...api/java/lang/Thread.html
Lees het verhaaltje over de depricated methoden nog even door. Zelf heb ik er nooit problemen mee gehad, maar je hoort via een omweg de start en stop methoden te gebruiken door een bug in de Threadklasse. Deze zou overigens in de aankomende JDK gefixed moeten zijn volgens sun.

  • esf
  • Registratie: Juni 2002
  • Laatst online: 11-03 14:06

esf

stop() is een deprecated methode. Als je die niet wilt gebruiken, kun je ook the Thread stoppen door boolean r op false te zetten in de KnightRider klasse..

The hardest thing in the world to understand is the income tax. - Albert Einstein


  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
esf schreef op 12 maart 2003 @ 23:42:
stop() is een deprecated methode. Als je die niet wilt gebruiken, kun je ook the Thread stoppen door boolean r op false te zetten in de KnightRider klasse..
tis mischien een beetje onorthodox maar het maakt mij niet echt uit hoe, als het maar werkt :P

... Life is what happens when you are busy planning other things...


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Stop() is deprecated vanwege beveiligingsissues.

Het knalt namelijk gewoon je thread af zonder dat hij kijkt naar de interne state. Dus je kunt midden in een methode zitten bijvoorbeeld.

Met een boolean stoppen, en een methode stopThread waar je die boolean op true zet vang je dit goed af.

Java:
1
2
3
4
while(!stoppen)
{
  // doe je ding
}

  • Marcj
  • Registratie: November 2000
  • Laatst online: 23-08 17:52
Rinusch schreef op 12 maart 2003 @ 20:17:
[...]


Threat zit standaard in java
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
//knightrider
class KnightRider implements Runnable
{
    public boolean r=true; //runnen ja of nee
    Shuvvport sv;
    public int a;

    public void run()
    {
        while(r)
        {
            a=250;
            sv=new Shuvvport(1);
            //System.out.println("turd");
            try
            {
                Thread.sleep(a);
            }
            catch(InterruptedException e)
            {
            }
        }
    }

    public void stop()
    {
        r = false;
        interrupt();
    }
}
Je kunt zo ook stop() overriden en de functie netjes stoppen ;)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Marcj schreef op 13 March 2003 @ 10:42:
[...]

Je kunt zo ook stop() overriden en de functie netjes stoppen ;)
Dan moet je wel een class maken die inherit van Thread en niet implement van Runnable. Of je moet natuurlijk een Class StopableThread maken ofzo. en die gebruiken om om je runnable te laten runnen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Rinusch
  • Registratie: Mei 2002
  • Laatst online: 24-05 07:17
wasigh schreef op 13 maart 2003 @ 09:14:
Stop() is deprecated vanwege beveiligingsissues.

Het knalt namelijk gewoon je thread af zonder dat hij kijkt naar de interne state. Dus je kunt midden in een methode zitten bijvoorbeeld.

Met een boolean stoppen, en een methode stopThread waar je die boolean op true zet vang je dit goed af.

Java:
1
2
3
4
while(!stoppen)
{
  // doe je ding
}
het gaat hier o een looplichtje wat je op elk moment kunt afbreken, nix meer nix minder, meer doet het ook niet, dus dat het abrupt stopt is alleen maar gunstig :D

... Life is what happens when you are busy planning other things...


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
mischien moet je dit even lezen
http://java.sun.com/j2se/...PrimitiveDeprecation.html
hier staat beschreven waarom je eigenlijk geen stop zou moeten gebruiken. Maar als je het op deze manier zou doen is het toch ook niet zo'n probleem
Java:
1
2
3
4
while( !stoppen )
{
    //loop een stukje
}


als je dan stoppen op false zet zal het looplichtje metteen stoppen ( Hij maakt hoogstens nog de loop af waar hij in bezig is ). Je kan dan ook nog thread.interrupt() aanroepen om te zorgen dat hij uit zijn sleep state gaat. ( er wordt dan natuurlijk wel een InterruptedException gethrowed )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Denk eraan om die boolean als volatile te declareren, zodat de vm mogelijkerwijs geen optimalizaties door gaat voeren en de waarde altijd uit het geheugen gelezen wordt

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

.oisyn schreef op 13 March 2003 @ 15:07:
Denk eraan om die boolean als volatile te declareren, zodat de vm mogelijkerwijs geen optimalizaties door gaat voeren en de waarde altijd uit het geheugen gelezen wordt
Volatile heeft toch alleen te maken met marshallen?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

weet ik eigenlijk niet, ik ging er vanuit dat het dezelfde betekenis had als in C++ :D
* .oisyn gaat even kijken :)

.edit: nee, het betekent wel gewoon wat ik zei :)
http://www7b.boulder.ibm....ct/0/ide/ref/rikvolat.htm

[ Voor 37% gewijzigd door .oisyn op 13-03-2003 15:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1