Threadprogrammierung - zwei Threads parallel - einer beendet

Status
Nicht offen für weitere Antworten.

Proggy

Bekanntes Mitglied
Hallo,

habe ein Problem mit Threads. Etwas kompliziert zu erklären, ich versuchs mal erst allgemein.

Es werden mehrere Bildchen dargestellt. Wird auf eines geklickt, so soll das Programm fortgesetzt werden. Dies funktioniert.
Jetzt soll es aber so sein, daß, wenn niemand klickt, es nach spätestens z.B 10 Sekunden ebenfalls fortgesetzt wird. Also müßte ich doch einen zusätzlichen Thread starten, der quasi 10 Sekunden wartet und danach den Thread 1 informiert, daß es weitergeht.

Ich poste hier mal Quellcode. Zuerst mal den Hauptteil meines Programms
Code:
public void zahlenspiel()
	{
	  //addWindowListener(new WindowClosingAdapter(true));	
	}
	
	String commandstring;
	public void ablauf()
	{
		abwarter wrt1= new abwarter();    <------Deklaration einer Instanz von Klasse abwarter
		MyMouseListener w1 = new MyMouseListener();
		int rwert;
		addKeyListener(new MyKeyListener());
		addMouseListener(new MyMouseListener());
		
	        synchronized (th1) {
		while(spielnr<=5){ //Anzahl der Spiele
		while (i<=75)  //Bildwechseldauer
		   {
		    sperre=1;
			zufallszahl();
		    repaint();
		    try {
			th1.sleep(25);
		    }catch (InterruptedException exc){
		    	//nix
		    							   }                                
		   i++;
		   } //inneres while-Ende
		//zufallszahl();  //lese Werte aus Datenbank
		//repaint();
		repaint();
		sperre=0;
		jetzt_klicken=1;
		//Freigabe-Sound abspielen
		try{
		playsamplefile("klickfreigabe.wav",0,0);}catch(Exception e){//nothing
		                                                             
		}
		//repaint();
	
	repaint();
		
	   i=0; 
          
           wrt1.run();	       <----------hier starte ich doch den Thread von wrt1, oder???  <--hier liegt mein Problem
	  !!! sobald diese Zeile, also wrt1.run() nicht auskommentiert ist, klappts nicht !!!
           try {th1.wait();}catch (InterruptedException e){}    <---- funktioniert, bei Mausklick setzt Funktion
                                                                                          // MousePressed th1.notify() und Prog läuft weiter
           
	   spielnr++;
	  t_klicken=0;		//Klicksperre aktivieren
		}  
		}
		 
	
		try{
		stmt = cn.createStatement();
		//$sqlstring="INSERT INTO spielwillige (nick) VALUES ('$spielername')";
		String spieler="\"Pucki\"";
		commandstring="INSERT INTO highscores  (nick, score) VALUES (" +  spieler + " , " + punktestand +")";  
		rwert=stmt.executeUpdate(commandstring);
		   }
		//rs=stmt.executeQuery("Select nickname,punktestand from aktivespieler");}
	catch(Exception e){e.printStackTrace();} 	
		
		
		
		
		
//	nach letzter Spielrunde: Pause und Ende des Spiels
		try{  
		 repaint();
			Thread.sleep(50000);
	 }catch (InterruptedException exc){
	    	 exc.printStackTrace();
		     //nix
	    							   }  
	System.exit(0); 
	
		    
	
   }

Das Problem ist die Klasse abwarter:
Code:
public class abwarter extends Thread implements Runnable  //warte einige Zeit
{
	abwarter thread;
	hz1=0;   //Schleifenvariable
	public void start()
	{
	  if (thread==null){
	  Thread thread = new Thread(this);
	  thread.start();  
	                          }
	
	}

	  public void run()
	  {
		
		synchronized(th1){
		 for (hz1=10;hz1>0;hz1--)   //warte 10 Sekunden
		    {
			 try{thread.sleep(1000);}catch(InterruptedException ex){}
			 
		    }
         th1.notify();   //informiere th1, daß Wartezeit beendet
		                 }
		}





}  //ende Klasse abwarter

Wie kann ich das Problem lösen? Also so wartet er zwar, aber reagiert nicht auf Klicks auf die Bilder, denn dann soll er ja weiterlaufen. Mein Thread von wrt1 schiebt sich also vor th1 statt daß er parallel dazu läuft.
[/b]
 
B

Beni

Gast
Ein Thread startet man mit "start", nicht mit "run". Ich hab nicht ganz durchschaut wie all deine Threads miteinander interagieren, aber mir kommt es vor, als würdest du das komplizierter machen, als es notwendig wäre.

Ein Beispiel wie es ziemlich einfach geht:
Code:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ClickOrRun extends JFrame{
	public static void main( String[] args ){
		ClickOrRun c = new ClickOrRun();
		c.setDefaultCloseOperation(  JFrame.EXIT_ON_CLOSE );
		c.pack();
		c.setVisible( true );
	}
	
	private JButton button;
	private Wait wait;
	
	private int count = 0;
	
	public ClickOrRun(){
		wait = new Wait();
		button = new JButton( "Klick mich um zu starten" );
		button.addActionListener( new ActionListener(){
			public void actionPerformed( ActionEvent e ){
				click();
			}
		});
		
		add( button );
		wait.start();
	}
	
	public void click(){
		button.setText( "Klick mich: " + count++ );
		
		// Den Zaehler neu starten
		wait.restart();
	}
	
	private class Wait extends Thread{
		// true wenn neu gestartet wird
		private boolean restart = false;
		
		// true wenn dieser Thread gerade "click" aufruft
		private boolean onClick = false;
		
		@Override
		public void run(){
			while( true ){
				// 10 Sekunden warten
				try {
					System.out.println( 10 );
					for( int i = 9; i >= 0; i-- ){
						Thread.sleep( 1000 );
						System.out.println( i );
					}
				} catch( InterruptedException e ) {
					// ignore
				}
				
				// Falls kein Neustart: klicken
				if( !restart ){
					try {
						EventQueue.invokeAndWait( new Runnable(){
							public void run(){
								onClick = true;
								click();
								onClick = false;
							}
						});
					} catch( InterruptedException e ) {
						e.printStackTrace();
					} catch( InvocationTargetException e ) {
						e.printStackTrace();
					}					
				}
				
				restart = false;
				interrupted();
			}
		}
		
		public void restart(){
			synchronized( this ){
				restart = true;
				if( !onClick )
					interrupt();
			}
		}
	}
}
 

Proggy

Bekanntes Mitglied
Hallo,

erstmal Danke.
Aber kann ich diese Lösung auch für mein Problem verwenden, schließlich sollen bei mir doch Bilder angeklickt werden und keine Buttons. Oder ist das darauf irgendwie übertragbar?

Also es ist so:
Reihenfolge:
Zuerst erscheinen die Bilder.
Dann hat der Spieler 10 Sekunden Zeit, ein Bild anzuklicken. Tut er dies, erscheinen die nächsten 5 Bilder sofort. Tut er dies nicht, so gehts nach Ablauf der 10 Sekunden automatisch weiter.
Das Ganze wird dadurch verschärft, daß ein "Countdown-Zähler" während der 10 Sekunden rückwärts läuft, der später zusätzlich noch mit einem Sound begleitet werden soll.


Ich weiss, ich muss noch viel in Java lernen.
 

Tobias

Top Contributor
Wenn du javax.swing.Timer benutzt, sparst du dir die Programmierung eines eigenen Timerthreads UND wirst keinerlei Probleme mit der Aktualisierung der GUI bekommen - Swing ist ja schließlich nicht threadsicher.

Zu Benis Lösung: Leg die Bilder doch einfach auf die Buttons...

mpG
Tobias
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Threads Threadprogrammierung wait() und notify() Allgemeine Java-Themen 4
M Java & Midi - ThreadProgrammierung Allgemeine Java-Themen 8
J java.lang.NullPointerException bei Threadprogrammierung Allgemeine Java-Themen 9
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
D Zwei Listen vergleichen Allgemeine Java-Themen 7
Tobero Wie berechnet man ob zwei Linien sich schneiden? Allgemeine Java-Themen 2
kodela Zwei gleichzeitig gedrückte Steuertasten Allgemeine Java-Themen 10
X Bedingung zwei mal überprüfen Allgemeine Java-Themen 4
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
D Input/Output Zwischen zwei ID-Räumen unterscheiden und Objekt löschen Allgemeine Java-Themen 16
D OOP Gemeinsamen ID-Raum für zwei Klassen implementieren Allgemeine Java-Themen 7
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
S Kann man Variablen oder Felder definieren deren Typ zwei Interfaces ist..? Allgemeine Java-Themen 9
K Aus String zwei Jahreszahlen auslesen Allgemeine Java-Themen 18
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
VfL_Freak Double mit zwei festen NK-Stellen ausgeben Allgemeine Java-Themen 9
Neoline Methoden Zwei Arrays abwechselnd zusammenführen Allgemeine Java-Themen 15
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
D Best Practice Die niedrigste Differenz zwischen zwei Listen ermitteln. Allgemeine Java-Themen 10
J Fahrroute zwischen zwei Punkten finden Allgemeine Java-Themen 1
J Kollision von zwei Kreisen Allgemeine Java-Themen 15
J Transfer von Integer zwischen zwei Clients - RMI Allgemeine Java-Themen 4
S Variablen split-Funkton mit zwei Variabeln verwenden? Allgemeine Java-Themen 4
T Alle Kombinationen aus zwei Arrays Allgemeine Java-Themen 8
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
AssELAss Zwei Arrays / ArrayLists inhaltlich vergleichen Allgemeine Java-Themen 2
H RegularExpression zwischen zwei Strings Allgemeine Java-Themen 2
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
A Lineare Interpolation mit zwei Arrays Allgemeine Java-Themen 4
E Berechnung des Schnittpunktes von zwei Geraden Allgemeine Java-Themen 1
S Zwei String vergleichen, Fehler markieren Allgemeine Java-Themen 3
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Dechasa Vergleichen von zwei Arrays Allgemeine Java-Themen 4
P Zwei ArrayLists: Ohne die eine überhaupt anzurühren, wird sie verändert Allgemeine Java-Themen 2
S Anwendung zum ausrechnen der Differenz von zwei Tagen Allgemeine Java-Themen 9
F Zwei LinkedHashMaps iterieren und vergleichen Allgemeine Java-Themen 2
M Zwei unterschiedliche JAR Dateien mit ANT erstellen Allgemeine Java-Themen 8
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
L Zwei Files miteinander vergleichen und Grafisch darstellen Allgemeine Java-Themen 1
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
F Webstart zwei Java Versionen / aktivieren bzw deaktivieren Allgemeine Java-Themen 2
S Zwei Comparable (compareTo) vergleichen Allgemeine Java-Themen 6
E zwei Gleitkommazahlen durcheinander dividieren Allgemeine Java-Themen 2
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
C Threads Zwei Threads greifen auf LinkedList zu. Allgemeine Java-Themen 12
T Wie heißt ein Binärbaum, dessen Knoten immer zwei Kinder haben müssen? Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
M Eclipse drei slashs durch zwei ersetzen? Allgemeine Java-Themen 3
1 zwei Strings vergleichen Allgemeine Java-Themen 16
C Buchstaben, die in zwei Wörtern vorkommen Allgemeine Java-Themen 13
J Gleiche Packagestruktur in zwei *.jar Dateien Allgemeine Java-Themen 4
G Zwei bytes vergleichen Allgemeine Java-Themen 2
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
C Zwei Arrays vereinen Allgemeine Java-Themen 3
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
H Zwei verschiedene Dateien mittels einem Binärstream übertragen? Allgemeine Java-Themen 13
N hashCode() für zwei ints Allgemeine Java-Themen 5
turmaline Gleichheit von zwei Maps Map <String, Map <String, String>> Allgemeine Java-Themen 30
N Wie Listenabgleich auf zwei CPU Cores auslagern? Allgemeine Java-Themen 6
D Zufall wahr bzw. falsch mit zwei Faktoren Allgemeine Java-Themen 10
H Datenaustausch zwischen zwei Java-Programmen Allgemeine Java-Themen 5
H Ausgabe von zwei Textfeldern Allgemeine Java-Themen 3
H Zwei unabhängige Threads miteinander kommunizieren lassen Allgemeine Java-Themen 3
G zwei mal synchronized Allgemeine Java-Themen 5
Z zwei Daten vergleichen Allgemeine Java-Themen 4
C ArrayList anhand von zwei Attributen sortieren Allgemeine Java-Themen 4
S Alle Elemente von zwei Listen vergleichen Allgemeine Java-Themen 10
T IText: Zwei A4 PDF´s auf ein A3 PDF´s Allgemeine Java-Themen 2
J Verschachtelte ListIteratoren um in zwei Listen hin und herzugehen Allgemeine Java-Themen 5
A Differenz zwischen zwei Uhrzeiten Allgemeine Java-Themen 7
H Shortcut ruft zwei Menu-punkte auf Allgemeine Java-Themen 5
J Zwei konstruktoren? Allgemeine Java-Themen 8
A zwei listen vergleichen und unterschiede anzeigen Allgemeine Java-Themen 3
J Zwei sortierte Listen zusammenfassen Allgemeine Java-Themen 8
G Linked List zwischen zwei Threds übergeben Allgemeine Java-Themen 11
J zwei HashMaps vereinen Allgemeine Java-Themen 3
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
G Jfreechart zwei charts Allgemeine Java-Themen 2
S Zwei Anwendungen unter Tomcat Allgemeine Java-Themen 4
T Anzahl Tage zwischen zwei Daten - Stunde fehlt? Allgemeine Java-Themen 2
V Zwei ArrayList(s) vergleichen Allgemeine Java-Themen 6
T Überprüfen ob zwei Farben ähnlich sind Allgemeine Java-Themen 14
M zwei main-Methoden Allgemeine Java-Themen 7
P zwei JFrames zusammenhängen Allgemeine Java-Themen 4
A Summe und Produkt von zwei Feldern ( arrays) Allgemeine Java-Themen 9
M HashMap kapselt zwei Objekte aber wie baut man eine Matrix? Allgemeine Java-Themen 2
H zwei Date Variablen überschreiben sich Allgemeine Java-Themen 2
2 Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 2
G Tage zwischen zwei Datumsdaten zählen Allgemeine Java-Themen 3
J Zwei String auf ähnlichkeiten untersuchen? Allgemeine Java-Themen 3
C kürzester weg zwischen zwei Punkten, Koordinaten finden Allgemeine Java-Themen 15
B zwei Bilder miteinander vergleichen Allgemeine Java-Themen 25
L Anzahl Tage zwischen zwei Kalenderdaten Allgemeine Java-Themen 5
G Kommunikation von zwei Java-Programmen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
S zwei Arrays zusammenfassen Allgemeine Java-Themen 14
L Zwei Hashtables statt einer? Allgemeine Java-Themen 6
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
A funktion schiffeZeichnen zwei mal aufrufen Allgemeine Java-Themen 16

Ähnliche Java Themen


Oben