# Daemon Thread



## gamebreiti (29. Mai 2014)

Hallo Leute,

ich arbeite an einem Kartenspiel. Nun suche ich nach einer Möglichkeit folgendes umzusetzen.

Ich habe eine Angriffskarte welche es erlaubt einen bestimmten Gegenspieler anzugreifen. Also habe ich ein Auswahlfenster in welchem die anderen Spieler als Buttons(Spieler 2, Spieler 3 usw.) angezeigt werden. Ich möchte NACH der Auswahl welcher Spieler angegriffen wird überprüfen ob der angegriffene Spieler sich verteidigen kann. 
An den Buttons hängen Actionlistener dran, welche ja autmatisch eine Daemon Thread erzeugen. 
Gibt es eine Möglichkeit, daß die main wie mit join() auf den Buttonclick (und damit das der Thread stirbt) wartet?


Hier noch ein bisschen Code

```
public static void getAktion(int i) {
		
		
		//Angriffsaktion
		zug--;
		angreifenThread.start();
		try {
			angreifenThread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
			if (choose == true)
				if(erfolg == true)
			Aktion.karteZiehen(1);
			
			
		
		zug++;
		aktionPanelUpdate(geld, zug, muenzen, kauf);
		Handkarten.Refresh(listnz,handk,listGespielteKarte,listabl);
	
}
	@Override
	public void run() {
		Aktion.angreifenSolo(1, KNUEPPEL);
		
	}
}
```


```
public static void angreifenSolo(int angriffswert, String karte) {
		trefferPunktAngriff = angriffswert;
		
		//MouseListenerobjekt
		AttSPML attSpML = new AttSPML();
		
		//oeffne Auswahlfenster, welcher Spieler angegriffen werden soll
		angriffsMenu = new JFrame("Spieler: " + spieleranzahl);
		angriffsMenu.setBounds(250,338,500,700);
		angriffsMenu.setUndecorated(true);
		angriffsMenu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
		angriffsMenu.setLayout(null);
		angriffsMenu.setBackground(new Color(0,0,0,1));
		infoUpdate("Wähle einen Mitspieler aus");
		// Panel fuer Hintergrundfarbe
		JPanel back = new JPanel();
		back.setSize(150,180);
		back.setBackground(new Color(0,0,0,0));
		
		// Bilder fuer Button erzeugen
		JLabel bild6 = new JLabel(pos2 + " Spieler");
		bild6.setFont(new Font("Papyrus", Font.BOLD,18));
		bild6.setForeground(Color.WHITE);
		JLabel bild7 = new JLabel(pos3 + " Spieler");
		bild7.setFont(new Font("Papyrus", Font.BOLD,18));
		bild7.setForeground(Color.WHITE);
		JLabel bild8 = new JLabel(pos4 + " Spieler");
		bild8.setFont(new Font("Papyrus", Font.BOLD,18));
		bild8.setForeground(Color.WHITE);
		
		// Buttons erzeugen
		
		for(int count = 1; count < spieleranzahl; count++){
			
			attSp[count] = new JButton();
			attSp[count].setIcon(bilder[48]);
			attSp[count].addActionListener(attSpML);
			attSp[count].setBounds(200,(5 + count*60),128,50);
			//Elemente einbinden
			angriffsMenu.add(attSp[count]);
			if(count == 1)
				attSp[count].add(bild6);
			if (count == 2) 
				attSp[count].add(bild7);
			if (count == 3) 
				attSp[count].add(bild8);
		}
		angriffsMenu.add(back);
		angriffsMenu.setVisible(true);
		
		
			
	}
	public static void trefferpunkteAbwehren(int x, int y,int kraftVerteidiger,int Verteidiger) {
		
		int angriffswert = y;
		int absorbtionswert = x;
		
		if (angriffswert - absorbtionswert <= 0)
			erfolg = false;
			if (erfolg == true){
				kraftVerteidiger = kraftVerteidiger - y;
			schreibeKraft(Verteidiger, kraftVerteidiger);
			
		}
			erfolg = true;
	}
	private static class AttSPML implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			int verteidiger = 0;
			// loesche Pruefen
			pruefen.clear();
			// Hole Handkarten des ausgewählen Spielers und Kraftanzeige
			if((e.getSource() == attSp[1])){
				if (pos2 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos2 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos2 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos2 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos2;
				choose = true;
			}
			if(spieleranzahl > 2){
			if((e.getSource() == attSp[2])){
				if (pos3 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos3 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos3 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos3 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos3;
				choose = true;
			}
			}
			if(spieleranzahl > 3){
			if((e.getSource() == attSp[3])){
				if (pos4 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos4 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos4 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos4 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos4;
				choose = true;
			}
			}
			bannreifAktivFuerDefense(verteidiger);
			handkartenAufRuestungPruefen(trefferPunktAngriff,verteidiger);
			angriffsMenu.dispose();
		}
	}
```

Ist ein eigener Thread sinnvoll oder sollte man darauf verzichten und  auf den Daemon Thread warten??
Hängen schon 2 Wochen dran 

Gruß gambreiti


----------



## gamebreiti (29. Mai 2014)

nochmal zum besseren Verständnis... ich setze im Actionevent ( also wenn ein Mitspielerbutton gedrückt wurde) ein boolean auf true,
anschließend soll eine if-Anweisung überprüfen ob der boolean true ist, wenn ja wird die Kartenhand des gewählten Spielers auf Verteidigungskarten überprüft. Hat dieser keine bekommt der aktive Spieler eine neue Karte. Beim debuggen sehe ich aber das der boolean noch false ist, da das Programm nicht wartet bis der User seine Benutzeeingabe via Mouseclick gemacht hat.

Die Anderen Methoden funktionieren reibungslos. Wenn ich den boolean am Anfang auf true setze statt auf fasle funktioniert es alles reibungslos (aber halt immer)

Hilfe !!!! Bin für jede Idee dankbar


----------



## Gucky (29. Mai 2014)

Lass doch den ActionListener die weitere Verarbeitung anstoßen und nicht das Programm warten. Oder du lässt den Thread warten mit wait() und weckst ihn im ActionListener wieder auf.


----------



## gamebreiti (1. Jun 2014)

danke für die Idee @ gucky. 

Doch soll das Auswahlfenster und damit der Actionlistener überall einsetzbar sein. D.h. Er soll wirklich nur die Kartenhand des ausgewählten Spielers in ein eine Liste zur Überprüfung laden und den boolean auf true setzen um festzustellen, dass die Auswahl getroffen wurde.
Wenn der Actionlistener eine Methode direkt aufrufen würde, müßte ich an der Stelle alle möglichen Angriffskarten berücksichtigen und dort unterscheiden via if oder so. Dies würde ich aber gern in der getAktion - methode der jeweiligen Karte regeln.

Ich glaube, ich mache es so dass ich einen anderen Thread starte in dem eine while schleiße liegt und auf choose == false prüft. Erst wenn chooe auf true gesetzt wird werden die weitere Überprüfungen ausgeführt und damit der Thread auch beendet sein.


----------



## Gucky (1. Jun 2014)

Es gäbe noch die Möglichkeit, den Thread mit wait anzuhalten und dem ActionListener eine Variable mitzugeben, die eine Methode bereitstellt, die den Thread notyfied.


----------

