[Java] Thread probleempje

Status
Niet open voor verdere reacties.

niekfct

Terugkerende gebruiker
Lid geworden
19 jul 2006
Berichten
1.563
Hoi

ik ben een applicatie aan het maken, de main start Thread1, Thread1 start Thread2, en Thread2 start op zijn beurt weer een nieuwe Thread1. (Met wat gerommel en gebruikersinput ertussen).

Ik hoop dat dat duidelijk is.

Nu heb ik 2 vragen. Hoe kan ik de eerste Thread1 stoppen? Kan dit niet?
En als ik in Thread2 opnieuw Thread1().start(); doe, krijg ik java.lang.IllegalThreadStateException.

volgen jullie het nog? Ik hoop dat jullie een oplossing hebben! :D

alvast bedankt ;)
 
je hebt twee Thread1's?

het lijkt er nu iig op dat als Thread2 al runt je Thread1 start, maar die is al gestart anders heb je geen Thread2.

een Thread stoppen doe je door hem te deleten, wil je dat of wil je hem pauseren?
 
Nee ik wil dus gewoon de thread helemaal opnieuw starten. Thread1 mag als het ware helemaal niet meer bestaan als Thread2 draait, en als Thread2 Thread1 start mag Thread2 weer verdwijnen..
 
kan ik hier Thread1.destroy() voor gebruiken? er staat namelijk in de Api "without any cleanup." bij.

oh het is gewoon destroy() merk ik, ik ga het even testen ;)

destroy(); werkt ook niet, is ook 'deprecated'.

Laat ik het ook eens simpeler maken:
Code:
 new startVenster().start();
 new startVenster().start();

//en

new startVenster(2).start();                    //de constructor naar public startvenster(int a) veranderd.
new startVenster(3).start();
werkt ook niet, zelfde fout. Waarom niet?

Code:
//uit een eerder project:
ChatServerThread b = new ChatServerThread(vSocket, a);
b.start();
werkt wél meerdere malen.
 
Laatst bewerkt:
Ik ben geen java programmeur, maar probeer eerst eens een obect (thread) te maken. Hierna deze te starten.

Verschil:

Jij: new object.Start

Eerder: Object obj = new Object
obj.start()
 
Van wat ik geleerd heb...
Bij threads is het zo dat als je deze eenmaal compleet stopt dat je diezelfde niet weer op kan starten. Je zal dan een nieuwe instantie van die thread aan moeten maken of je zal dan de Sleep gebruik moeten maken als je een thread tijdelijk wil stoppen.
 
Nee,

Code:
startVenster a = new startVenster();
startVenster b = new startVenster();

a.start();
b.start();

geeft dezelfde foutcode weer :confused:
 
laat anders de gehele code eens zien van je startvenster en dan vooral het gedeelte waar je ze instantieert en de constructor
 
PHP:
public class Sss extends Thread
{
    //algemene variabelen die door andere klasses aangesproken en veranderd worden
    public static startVenster a = new startVenster();
          
    public static void main(String[] args)
    {
        a.start();
            
    }
}

PHP:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class startVenster extends Thread implements ActionListener
{
    
    //verschillende 'public static' variabelen/objects voor venster etc.       
    
    public startVenster()
    {
        
    }
    
    public void run()
    {
          //venster aanmaken + actionlisteners toekennen
    }
        
    public void actionPerformed(ActionEvent e)
    {
        //verschillende buttons die verwijzen naar verschillende methodes
    }
    
    //verschillende methodes
    
    public void einde()
    {
      venster2 p = new venster2();
       p.start();
    }

PHP:
public class venster2 extends Thread implements ActionListener
{
    
    //verschillende 'public static' variabelen/objects voor venster etc.       

    public venster2()
    {
        
    }
        
    public void run()
    {
        //venster aanmaken/objecten toevoegen/actionlisteners
    }
    
        public void einde()
        {
                        
            if(a)          //boolean a is true of false
            {
                startVenster q = new startVenster();
                q.start();
            }
            else
            {
                 venster3 w = new venster3();
                 w.start();
            }

        }

public void actionPerformed(ActionEvent e)
    {
        //verschillende buttons die verwijzen naar verschillende methodes
    }
}

ik denk dat dit de grote lijnen wel een beetje weergeeft..:confused:
 
Laatst bewerkt:
volgens mij is het niet meer de bedoeling dat je threads extend, je moet Runnable extenden zodat het een Thread wordt
 
Ik heb ondertussen van de threads gewoon klasses gemaakt, ik dacht eerst dat dit niet kon, maar het werkt, dus het kan wel! :D

Maar hoe zit dat dan, met dat runnable gedoe, wat is het verschil?
 
volgens mij is Thread oud, dit moest je dus vroeger gebruiken maar ze hebben nou een aantal veranderingen gemaakt waardoor je Runnable moet gebruiken hier een voorbeeld:

Code:
public class Kernel implements Runnable{
    private Thread engineThread;

    public Kernel(){
        engineThread = new Thread( this );
    }
    public void initialize(){
        engineThread.start();
    }

    public void run(){
        //doe je stuff hier.
    }
}

ps ik had voorheen gezegd dat je Runnable moest extenden maar je moest hem dus implementen
 
ps ik had voorheen gezegd dat je Runnable moest extenden maar je moest hem dus implementen

Ja dat had ik al door ;)

Ik wil nu dus een Thread (of Runnable) gebruiken om te checken of er wel op een knop gedrukt mag worden: er mogen alleen maar getallen in invoerVeld staan. Ik had hier dus al een Thread van. Hoe moet ik hier dan Runnable van maken?:

PHP:
public class Check extends Thread
{
    
    public Check()
    {
        
    }

    
    public void run()
    {
        
        while(StartVenster.VensterLives)
        {
            try{
            sleep(10);
            }catch(InterruptedException f){}
            try{
                Double a = Double.parseDouble(StartVenster.invoerVeld.getText());
            }catch(java.lang.NumberFormatException e)
            {
                StartVenster.invoerVeld.setText("");
                StartVenster.knop.setEnabled(false);
            }
        }
        
    }
    
}
 
Laatst bewerkt:
Code:
public class Check implements Runnable
{
    private Thread myThread;
    public Check()
    {
        myThread = new Thread( this );
        myThread.start();
    }

    
    public void run()
    {
        
        while(StartVenster.VensterLives)
        {
            try{
            sleep(10);
            }catch(InterruptedException f){}
            try{
                Double a = Double.parseDouble(StartVenster.invoerVeld.getText());
            }catch(java.lang.NumberFormatException e)
            {
                StartVenster.invoerVeld.setText("");
                StartVenster.knop.setEnabled(false);
            }
        }
        
    }
    
}

zoiets? ik vraag me wel af wrm je hier een thread voor gebruikt want je haalt je nu waarschijnlijk meer problemen op de hals dan je er mee op lost maar daar kom je wel achter als je de thread werkend hebt
 
Hoezo problemen? Ik had hem dus al werkend toen hij nog gewoon Thread was, en deed het goed (nadat ik de sleepfunctie had toegevoegd).

Bedankt trouwens! Nu kan ik dit even uitproberen ;)
 
problemen omdat je nu wellicht "gelijktijdig" twee verschillende dingen wilt doen. (bv het invoerveld uitlezen en het invoerveld leeg maken)
 
dat invoerveld leegmaken gebeurt alleen als er iets anders dan een getal of een punt in het invoerveld staat. het invoerveld uitlezen gebeurt alleen als er op de knop gedrukt wordt, deze is disabled als er iets anders dan een getal of punt in staat, dus dat gaat langs elkaar heen. Ik neem aan dat je niet binnen 1/100e sec een letter intypt en op die knop drukt :p

Ik had trouwens dit er ook nog bij staan:

Code:
if(!(StartVenster.invoerVeld.getText().equals("")))
            {
                StartVenster.knop1.setEnabled(true);
            }
            else
            {
                StartVenster.knop1.setEnabled(false);
            }

dus zal het zo worden:

Code:
public class Check implements Runnable
{
    private Thread myThread;
    public Check()
    {
        myThread = new Thread( this );
        myThread.start();
    }

    
    public void run()
    {
        
        while(StartVenster.VensterLives)
        {
            try{
            sleep(10);
            }catch(InterruptedException f){}
            try{
                Double a = Double.parseDouble(StartVenster.invoerVeld.getText());
            }catch(java.lang.NumberFormatException e)
            {
                StartVenster.invoerVeld.setText("");
                [COLOR="Red"]//StartVenster.knop.setEnabled(false);[/COLOR]
            }

           [COLOR="Lime"]if(!(StartVenster.invoerVeld.getText().equals("")))
            {
                StartVenster.knop1.setEnabled(true);
            }
            else
            {
                StartVenster.knop1.setEnabled(false);
            }[/COLOR]
        }
        
    }
    
}
 
Laatst bewerkt:
Ja, had ik nog niet gezegd hè? Haha bedankt ja! :D:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan