# Problem mit STATIC-Verständnis



## gues22 (12. Sep 2012)

Hi 

ich hab eine klein Frage, worauf mir aber auch "Java ist auch eine Insel" und googeln nix sagt


```
public class SAR{
      
        public static boolean CONNECT = false; 
             
        
public Server() throws IOException{
	
	whilet();
        aftert();
}
 
public void whilet(){
	
	while(CONNECT == false){
	System.out.println("CONNECT: " + CONNECT);	
		
	}
}
```


Diese klasse SAR (nur notwendiger auszug) startet er main-methode, läuft durch den konstruktor und bleibt somit in der while()-methode hängen (endlosschleife)
sobald aber die statische variable CONNECT geändert wird, auf true, so ist die whilet() zuende und aftert() startet

aber: ich führe SAR aus (ausgabe lautet: false, false, false usw), 
doch nun führe ich in einer anderen klasse


```
void starten(){
SAR.CONNECT=true;
System.out.println(Server.CONNECT + "= true?");	
}
```

ergbnis:
-ich starte SAR (false,false,false etc)
-starte nun starten()
-konsole teilt mir durch "true= true?" mit, dass CONNECT wirklich true ist

DOCH: SAR läuft immer noch weiter und sagt mir, dass "Connect = false"

wieso sar SAR, dass CONNECT false ist
aber die andere klasse behauptet, dass CONNECT true ist.
was läuft da schief?


----------



## Michael... (12. Sep 2012)

gues22 hat gesagt.:


> wieso sar SAR, dass CONNECT false ist
> aber die andere klasse behauptet, dass CONNECT true ist.
> was läuft da schief?


Vermutlich startest Du zwei Applikationen. static gilt nur im Kontext einer Anwendung und nicht zwischen Anwendungen, die zudem in verschiedenen VM laufen.


----------



## SkonroX (12. Sep 2012)

Solange die endlos-Schleife laufend gehalten wird, ist es nicht möglich Werte innerhalb dieser Klasse zu ändern (ok schon möglich, jedoch nicht über den statischen Aufruf Class.Variable = true).
Das hat damit zu tun, dass der aktive Thread der Klasse ununterbrochen beschäftigt ist und keine Änderungen ermöglicht durch einen anderen Thread, würde man nur den Aufruf, mit dem setten vor der Schleife aufrufen, würde dies höchstwahrscheinlich noch die Änderungen übernehmen, falls vor dem start der endlos-Schleife noch der Wert gesetzt wird.

lg


----------



## gues22 (12. Sep 2012)

ach so ist das..
aber es ist ja nur ein JVM bzw ein prozess...
aber wenn ich CONNECT vorher schon auf true setze, dann kommt ja gar keine endlosschleife zustande

aber wie kann ich das dann machn:

ich brauche 2 klassen (Im endeffekt sind es dann 2 runnable .jar -dateien sein)

ich starte die ein jar-datei per doppelklick
dann läuft eine endlosschleife oder sowas

und starte ich das zweite programm, also die 2. jar-datei, so soll die schleife im ersten programm abgebrochen werden...

geht das?


----------



## tfa (12. Sep 2012)

Nein, das geht so nicht. Dazu braucht du eine Kommunikationsverbindung zwischen verschiedenen Prozessen, z.B. per Sockets, RMI, o.ä.


----------



## Empire Phoenix (12. Sep 2012)

gues22 hat gesagt.:


> ach so ist das..
> aber es ist ja nur ein JVM bzw ein prozess...
> aber wenn ich CONNECT vorher schon auf true setze, dann kommt ja gar keine endlosschleife zustande
> 
> ...



Sicher das du nicht eignetlich nen multithreading brauchst statt zwei prozessen?


----------



## kaetzacoatl (12. Sep 2012)

> Solange die endlos-Schleife laufend gehalten wird, ist es nicht möglich Werte innerhalb dieser Klasse zu ändern (ok schon möglich, jedoch nicht über den statischen Aufruf Class.Variable = true).


Natürlich geht das!
Sowas hab ich schon
x-mal gemacht.


----------



## Gues22 (13. Sep 2012)

hm okay aber wie haut das dann hin...?

kaetzacoatl? wieso gehts dann bei mir net?


----------



## Michael... (13. Sep 2012)

Gues22 hat gesagt.:


> hm okay aber wie haut das dann hin...?
> 
> kaetzacoatl? wieso gehts dann bei mir net?


Innerhalb einer Applikation und separaten Threads ginge das

```
Test.connected = false;
		new Thread(new Runnable() {
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				Test.connected = true;
			}
		}).start();
		while(!connected)
			System.out.println("not connected");
		System.out.println("connected");
```
Du versuchst es aber scheinbar über verschiedene Applikationen - die teilen sich keine Variablen und müssen über andere Mittel miteinander kommunizieren.


----------

