Gå til innhold

Anbefalte innlegg

Sitter litt fast med en tråd oppgave. Når man trykker på knappen skal neste verdi i for løkka skrives ut og wait() metoden skal kalles. Ingenting skal så skje før man trykker knappen igjen. Da skal neste verdi i for løkka vises, for så å vente. Problemet mitt er at tråden blir ventende etter første gang. Den blir ikke vekket opp, selv om jeg bruker notify. :(

 

Her er koden:

 

import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ControllThread {
   
   ViewThread view;
   Modell model;
   boolean newW = true;
   
   /** Creates a new instance of ControllThread */
   public ControllThread() 
   {
       model = new Modell(this);
       view = new ViewThread(this);
       //System.exit(0);
   }
   
   public static void main(String[] args)
   {
       new ControllThread();
   }
   
   public void buttonPressed()
   {
       if(newW)
       {
           //int numb;
           //numb = model.newValue();
           //view.print(numb);
           model.count();
           newW = false;
           model.moveOn();
       }
   }
   
   public void finished(Modell mod)
   {
       newW = true;
   }
   
}

class ViewThread extends JFrame
{
   JButton button, cancel;
   JLabel label;
   ControllThread cont;
   
   class buttonListener implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           if(e.getSource() == button)
               cont.buttonPressed();
           else
               System.exit(0);
       }
   }
   
   public ViewThread(ControllThread cnt)
   {
       super("ThreadGui");
       setFont(new Font("Serif", Font.PLAIN,18));
       setSize(400,100);
       cont = cnt;
       getContentPane().setLayout(new FlowLayout());
       label = new JLabel("Here is the answer");
       getContentPane().add(label);
       button = new JButton("Print out");
       cancel = new JButton("Cancel");
       getContentPane().add(button);
       getContentPane().add(cancel);
       button.addActionListener(new buttonListener());
       cancel.addActionListener(new buttonListener());
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
   }
   
   public void setText(JLabel label) {
       this.label = label;
   }
   
   public void print(int numb)
   {
       label.setText("The number is: " + numb + " ");
   }
}

class Modell
{
   private int number;
   private int max = 5;
   private ControllThread cont;
   
   public Modell(ControllThread cnt)
   {
       cont = cnt;
   }
   
   public int newValue()
   {
       return number;
   }
   
   public synchronized void moveOn()
   {
       notify();
   }
   
   public synchronized void waitNow()
   {
       //kontroll.ferdig(this);
       cont.finished(this);
       try
       {
           wait();
       }
       catch(InterruptedException e)
       {
       }   
   }
   
   public void count()
   {
       /*
       while(number < max)
       {
           number++;
           System.out.println(number);
           waitNow();
       }
        **/
       for (int i = 0; i < 10; i++)
       {
           System.out.println("Skriver ut i: " + i );
           waitNow();
       }
   }
   
}

Lenke til kommentar
Videoannonse
Annonse

Du har glemt å definere tråden din da ;)

 

model = new Modell(this);
model.start();

...

class Modell extends Thread

...

rename count() til run()

.. og kommenter ut count() i buttonPressed()
public void buttonPressed()
  {
      if(newW)
      {
          //int numb;
          //numb = model.newValue();
          //view.print(numb);
          //model.count();
          newW = false;
          model.moveOn();
      }
  }

 

Eller noe sånt..

Lenke til kommentar
Du har glemt å definere tråden din da ;)

 

model = new Modell(this);
model.run();

...

class Modell implements Runnable

...

rename count() til run()

.. og kommenter ut count() i buttonPressed()
public void buttonPressed()
  {
      if(newW)
      {
          //int numb;
          //numb = model.newValue();
          //view.print(numb);
          //model.count();
          newW = false;
          model.moveOn();
      }
  }

 

Eller noe sånt..

8428200[/snapback]

 

 

Nææ Må nok bruke implements Runanble hvis jeg skal bruke synchronized, men selv om jeg gjør det på denne metåne, så stopper den fortsatt opp etter første wait()... :hmm:

Lenke til kommentar

Her er et eksempel:

 

Klikk for å se/fjerne innholdet nedenfor
public class ThreadTest {

public ThreadTest() {
 Worker worker = new Worker();
 worker.start();
 
 try {
 	for(int i = 0; i < 100; i++) {
   Thread.sleep(1000);
   worker.printText("Text " + i);
 	}
 }
 catch(Exception ex) {
 	ex.printStackTrace();
 }
}

public static void main(String[] args) {
 new ThreadTest();
}

class Worker extends Thread {
 String text;
 
 public Worker() {}
 
 public synchronized void printText(String text) {
 	this.text = text;	
 	synchronized(this) { notify(); }
 }
 
 public void run() {
 	
 	while(true) {
   try {
   	synchronized(this) { wait(); }
   }
   catch(Exception ex) { ex.printStackTrace(); }
   
   System.out.println(text);
 	}
 }
}
}

Lenke til kommentar
Her er et eksempel:

 

Klikk for å se/fjerne innholdet nedenfor
public class ThreadTest {

public ThreadTest() {
 Worker worker = new Worker();
 worker.start();
 
 try {
 	for(int i = 0; i < 100; i++) {
   Thread.sleep(1000);
   worker.printText("Text " + i);
 	}
 }
 catch(Exception ex) {
 	ex.printStackTrace();
 }
}

public static void main(String[] args) {
 new ThreadTest();
}

class Worker extends Thread {
 String text;
 
 public Worker() {}
 
 public synchronized void printText(String text) {
 	this.text = text;	
 	synchronized(this) { notify(); }
 }
 
 public void run() {
 	
 	while(true) {
   try {
   	synchronized(this) { wait(); }
   }
   catch(Exception ex) { ex.printStackTrace(); }
   
   System.out.println(text);
 	}
 }
}
}

8428793[/snapback]

 

 

sorry, ble ikke noe smartere av eksempelet over for den kjører sleep antall sekunder, og det får jeg til. Det jeg ikke får til er at den skal wait til jeg notify den, med den samme knappen

Lenke til kommentar
Ja, så det, men hvorfor kaller han da på slepp. Holder ikke med wait?

8429351[/snapback]

 

Bare for å demonstrere (for å simulere at du f.eks trykker på en knapp med jevne mellomrom). Husk at sleep ble kalt i en annen tråd enn worker klassen og dermed var det ikke worker klassen som sov.

Lenke til kommentar

Bare en liten ting i koden under:

public synchronized void waitNow()
  {
      //kontroll.ferdig(this);
      cont.finished(this);
      try
      {
          wait();
      }
      catch(InterruptedException e)
      {
      }  
  }

 

Aldri bruk tomme catch blokker!!! Dersom wait() på en eller annen måte går på tryne her så får du aldri vite det.

 

Kan heller ikke se at du faktisk oppretter en egen tråd i koden. Ta en titt på Runnable interfacet og Thread klassen.

Lenke til kommentar
Vet ikke om dette er en god generell designregel? For meg virker det smart.

8429097[/snapback]

Jeg har erfart nå at den beste løsningen er å ha worker threads, som og implementerer observable, så har man f.eks GUI-tråden som er en observer, og som dermed oppdateres når nødvendig.

 

Tok det i bruk her etter tips fra en veileder, og jeg har enda ikke klart å finne ulempen med det. :)

Lenke til kommentar

Nå har jeg etter beste evne prøvd å ta lærdom fra ditt eksempel for å bygge videre på min, men har ikke fått det til helt skikkelig ennå, da jeg ender opp med en java.lang.IllegalThreadStateException. Feilmeldingen kommer etter at jeg har trykket andre gang:

 

Er vel også slik at notify skal komme etter wait. Problemet mitt er at jeg sitter fast etter wait.

Klikk for å se/fjerne innholdet nedenfor


import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ControllThread {
   
   ViewThread view;
   Modell model = new Modell(this);
   Thread mod = new Thread(model);
   boolean newW = true;
   
   /** Creates a new instance of ControllThread */
   public ControllThread() 
   {
       //model = new Modell(this);
       view = new ViewThread(this);
       //System.exit(0);
   }
   
   public static void main(String[] args)
   {
       new ControllThread();
   }
   
   public void buttonPressed()
   {
       if(newW)
       {
           //int numb;
           //numb = model.newValue();
           //view.print(numb);
           mod.start();
           //newW = false;
           //model.count();
           System.out.println("After start. Before notify");
           model.moveOn();
           System.out.println("After notify");
       }
   }
   
   public void finished(Modell mod)
   {
       newW = true;
   }
   
}

class ViewThread extends JFrame
{
   JButton button, cancel;
   JLabel label;
   ControllThread cont;
   
   class buttonListener implements ActionListener
   {
       public void actionPerformed(ActionEvent e)
       {
           if(e.getSource() == button)
               cont.buttonPressed();
           else
               System.exit(0);
       }
   }
   
   public ViewThread(ControllThread cnt)
   {
       super("ThreadGui");
       setFont(new Font("Serif", Font.PLAIN,18));
       setSize(400,100);
       cont = cnt;
       getContentPane().setLayout(new FlowLayout());
       label = new JLabel("Here is the answer");
       getContentPane().add(label);
       button = new JButton("Print out");
       cancel = new JButton("Cancel");
       getContentPane().add(button);
       getContentPane().add(cancel);
       button.addActionListener(new buttonListener());
       cancel.addActionListener(new buttonListener());
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setVisible(true);
   }
   
   public void setText(JLabel label) {
       this.label = label;
   }
   
   public void print(int numb)
   {
       label.setText("The number is: " + numb + " ");
   }
}

class Modell implements Runnable
{
   private int number;
   private int max = 5;
   private ControllThread cont;
   
   public Modell(ControllThread cnt)
   {
       cont = cnt;
   }
   
   public int newValue()
   {
       return number;
   }
   
   public synchronized void moveOn()
   {
       synchronized(this)
       {
           System.out.println("I notify metoden");
           notify();
       }
   }
   
   public synchronized void waitNow()
   {
       
       cont.finished(this);
       try
       {
           synchronized(this)
           {
               wait();
           }
       }
       catch(InterruptedException e)
       {
           System.out.println("Error e: " + e);
       }   
   }
   
   public void run()
   {
      System.out.println("Kommet i run metoden");
       /*
       while(number < max)
       {
           number++;
           System.out.println(number);
           waitNow();
       }
        **/
       for (int i = 0; i < 10; i++)
       {
           System.out.println("Skriver ut i: " + i );
           System.out.println("Before wait:");
           waitNow();
           System.out.println("After wait");
       }
   }
   
}

Lenke til kommentar

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...