Thread Synchronisation

T7V

Aktives Mitglied
Hi Leute,
Ich programmiere gerade so eine Art Stoppuhr.
dazu benutze ich zwei Klassen:

1. GraphOber
Diese ist eine mit Swing programmierte Oberfläche, welche unter anderem zwei Eingabefelder und einen JButton enthält. In diese kann man etwas eintragen (zB: wasauchimmer | 12:34), anschließend kann man mit einem klicken auf den Button einen Thread (2.Klasse) starten.
Der Thread erstellt dann ein JPanel, in dem die restliche Zeit angezeigt wird.

2.Zaehler
Dieser zaehlt dann die im zweiten eingegebene Zeit runter und zeigt anschließend ENDE an.

Das Problem ist:
Sobald ich einen zweiten Thread starte, übernimmt der erste Thread die Zeit vom zweiten und beide Threads zählen ab dann gemeinsam runter.
Ich verstehe das nicht so richtig. Eigentlich erzeuge ich doch jedesmal einen neuen Thread (GraphOber Zeile 40). Warum also überlappen die sich? Und wie vermeidet man so etwas?

Schon mal im voraus danke.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.* ;
import java.util.StringTokenizer;
import java.util.Scanner;

class Zaehler extends Thread{

  static String eingabe;

  static int dauer_ms;        //dauer in Millisekunden
  static int minuten;
  static int sekunden;       //Dauer in Sekunden
  static int dauer_s;

  static double prozent;

  JPanel zeile = new JPanel();

  JLabel titel;
  JLabel restzeit;



  public Zaehler (String a, String b){
    setName(a);
    eingabe = b;
    titel = new JLabel( a + ": " );   //JLabel mit dem Namen des Threads
    StringTokenizer st = new StringTokenizer(eingabe, ":");

    minuten = Integer.parseInt(st.nextToken());
    sekunden = Integer.parseInt(st.nextToken());

    dauer_ms = 60000*minuten + 1000*sekunden;

    dauer_s = (int) dauer_ms / 1000;    

    restzeit = new JLabel();


    restzeit.setText("Restzeit: " + minuten +":" + sekunden); 

    zeile.add(titel);

    zeile.add(restzeit);
    start();
  }
  public void run(){

    int merker = 0;

    prozent = dauer_s / 100.0;

    while ( minuten != -1 ){

      ++merker;
      try{
        sleep( 1000 );
      }catch(Exception e){
        System.out.println("ERROR");
      }
      sekunden -= 1;
      if (sekunden == -1){
        sekunden = 59;
        minuten -= 1;
      }
      restzeit.setText( "Restzeit: " + minuten +":" + sekunden);
    }
    restzeit.setText( "ENDE");
  }
}
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.* ;

class GraphOber extends JFrame implements ActionListener{


  JLabel eingabe  = new JLabel("Eingabe: ");
  JLabel eingabe2  = new JLabel("Zeit: ");

  JTextField tFeld1 = new JTextField( 7 );
  JTextField tFeld2 = new JTextField( 7 );

  JButton starten = new JButton ("Start!");

  public GraphOber( String title ){

    super( title );
    setLayout( new FlowLayout() );

    JPanel ersteZeile = new JPanel();

    starten.addActionListener( this );

    ersteZeile.add( eingabe );
    ersteZeile.add( tFeld1 );
    ersteZeile.add( eingabe2 );
    ersteZeile.add( tFeld2 );
    ersteZeile.add( starten);

    add(ersteZeile);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
  }
  public void actionPerformed( ActionEvent evt){

    String eingabe1 = tFeld1.getText() ;
    String eingabe2 = tFeld2.getText() ;

    Zaehler poi = new Zaehler(eingabe1, eingabe2);     //neuer Zaehler

    add(poi.zeile);

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

    GraphOber lol = new GraphOber ("LOL");

    lol.setSize( 400, 300 );
    lol.setVisible( true );
  }
}
 
also ich habe deinen code mal 1:0.99 übernommen, wo zählt denn da im JFrame was runter, ausser der anzeige vom zaehler?

EDIT: ah .. mehrere timer starten .. ^^
 
Zuletzt bearbeitet:
lösung .. du musst in der zaehlerklasse die static-deklarationen rausnehmen .. static bedeutet "für alle instanzen den selben wert" .. da du aber jeden zaehler individuell zaehlen lassen willst, musst auch individuelle werte pro instanz haben 🙂
 

Zurück
Oben