# Thread starten und Stoppen



## Numerobis (13. Dez 2006)

Hallo, 


ich steh seit kurzen vor einer Hürde.

Ich habe noich nie Thread basierte Anwendungen in diesem Rahmen geschriebn.

Nun muss ich einen Thread über ein TCP/IP Interface starten und Stoppen .

Also ich habe eine kleine Swing Maske auf dem Desktop des Kunden , und auf einem entfernten Server eine anwendung zur Steuerung bzw. Überwachung von Fertigungstrassen.

Nun soll nach der Auth und dem Security Check , die Anwendung gestartet werden.

Sie beeinhaltet einen "Master" Thread , der alle anderen Anwendungen Steuert.

Die Maske baut die Verbindung zum Server auf .

Der Kunde soll Start oder Stop Initieren können , aber wie starte oder stoppe ich nun den Thread ?

Ein Server Cliente Konzept , für die TCP ist bereits installiert. Aber die Threads zu starten , oder gar zu stoppen ist etwas schwierig.


Kann mir da einen nen Tip geben?

Euer Numerobis


----------



## DaKo (13. Dez 2006)

Thread.start();
Thread.stop();

 :?:


----------



## Numerobis (13. Dez 2006)

Danke , 


LOL


...

Aber wie mache ich das , das der Server Quasi wartet , das ich den Thread starte?



```
methode masterthread(){

...
}


while(start_knopf_nicht_gedrueckt){
masterthread = nicht laufen;

if (start_knopf_gedrueckt){

start.masterthread();

while(;;){
if(stop_knopf_gedrueckt){

stop.masterthread();

}


}
```


wie soll ich das umsetzen?

Also wie sag ich dem thread wann er starten und wann er stoppen soll?

Und das er eben warten , bzw. laufen möchte bis der Vorarbeiter die Maschinen wieder stopt? 


mir fehlt es hier irgendwie an Syntax Praxis .


----------



## DaKo (13. Dez 2006)

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html 



> Also wie sag ich dem thread wann er starten und wann er stoppen soll?



starten: Wenn der Startknopf gedrückt wird (ActionEvent)
stoppen: Wenn der Stopknopf gedrückt wird (ActionEvent)



> Und das er eben warten , bzw. laufen möchte bis der Vorarbeiter die Maschinen wieder stopt?


Endlosschleife


----------



## Numerobis (13. Dez 2006)

Ja geht das denn auch wenn der Server in diesem Falle gar nicht an das eigentliche AWT oder Swing Tool angebunden ist?


Ich mein die Panel Software ist ja auf einem anderen Rechner und verbindet via JavaBean .

Und der Server ist GUI los?
Ich mein den ActionListener.


Gib doch mal bitte ein Code  Beispiel


----------



## DaKo (13. Dez 2006)

```
myStartButton.addActionListener(
   new ActionListener ( ActionEvent ae){
      rmiCallForThreadStarting();
   }
);
```


----------



## Numerobis (13. Dez 2006)

Also lieben dank erstmal.


Das ist Clientseitig richtig?




und wie würdest du es Serverseitig Implementiern?

[/code]


----------



## DaKo (13. Dez 2006)

```
rmiCallForThreadStarting(){
   ... Sicherheitsabfragen z.B. ob der Thread schon läuft ...
   myThread.start();
}
```


----------



## L-ectron-X (13. Dez 2006)

Die stop()-Methode aus Thread is deprecated und sollte nicht mehr verwendet werden.
Statt dessen sollte mit isInterrupted() und interrupt() gearbeitet werden.
Beispiele dazu finden sich hier im Forum.


----------



## Numerobis (13. Dez 2006)

aha , 


und dann meinst du einfach in der Endloschleife den Socket nach neuen Informattionen vom Client abfragen lassen bzw. ihn auf incoming information warten lassen, 

und dann bei status x die methode 1 oder 2 oder 3 ausführen richtig?

Kann man dem Thread dann eine eindeutige ID zuweisen lassen und wenn der thread gestartet ist dann an den Client zzurückübermitteln lassen thread gestartet??


----------



## Numerobis (13. Dez 2006)

Also , 



```
ClientPanel(client_nr){

statknopf(){
connect to server ip;

Say start();

wait_for Return;

if return ok, say OK to -> Label;
}



stopknopf(){


connect to server x;

Say stop();

wait_for_return;
if return ok , say OK , stopped , to ->Label;
}



Panel(){

Show Start and Stop and Label 1;


}

}
```




```
Server (ip){


Listen on Socket ip for client incoming (or Shell Command) ;

if client Incoming , read command and set command to String Command ;

if Command = start , start.masterthread;
if Command = stop , stop.masterthread;
}
```


Die Application in Pseudo ;

Aber wie genau kann der Code aussehen für das warten auf das Commando ab , dem Socket?

Um den laufenden Thread immer zu stoppen bzw. immer starten zu können ?


----------



## Numerobis (13. Dez 2006)

Hier der Server Task der immer weiter läuft , und nicht stoppbar ist:


TimerThread ist nun als bsp. der Thread , der nur nach start in der Konsole startet es , und läuft Prima.


Das ist mein Problem 


java.lang.InterruptedException: sleep interrupted


Aber stoppen ... äh äh  :noe: 


```
import java.io.*;
    import java.net.*;
    
    import java.util.*;
    
    
public class server {
    int ff;
    BufferedReader b = null;
    
    /** Creates a new instance of server */
    public server() {
    
        b = new BufferedReader(new InputStreamReader(System.in));
    }
    
    String readln() throws java.io.IOException {return b.readLine();}
    
    
     public static void main(String[] args)    throws java.io.IOException{
         server r = new server();
         String s = null;
    Thread tomo = new TimeThread();
     while ((s = r.readln())!= "exit"){
     System.out.println(s);
    
     if (s.equals("start")){
 System.out.println("start Initiated");
    tomo.start();
     
     
     }else{ System.out.println("No Start initiatetd");}

     if(s.equals("stop")){


     tomo.currentThread().interrupt();


     
     }
     
     }
     }
     
     }
}
```

TimeThread ist eine beispiel klasse, um den anderen source nicht posten zu müssen.


```
import java.util.*;
public class TimeThread  extends Thread{
    
    /** Creates a new instance of TimeThread */
    public void run()
    {
    while(true){
    GregorianCalendar d = new GregorianCalendar();
     System.out.println(d.get(Calendar.HOUR_OF_DAY)+d.get(Calendar.MINUTE)+d.get(Calendar.SECOND));
    
   try{
   Thread.sleep(1000);
   } catch(Exception e){
   System.out.println(e);
   
   
   }
    }
    
    
    }
}
```


----------



## Numerobis (13. Dez 2006)

Ich habs jetzt geschafft!


Der Thread ist 1. static zu definieren , dann kann man ihn immer wieder neu starten und stoppen.

TimerThrad , also die auszuführende Ebene , ist nicht mehr "extends Thread" sonder Runnable !



```
import java.io.*;
    import java.net.*;
    
    import java.util.*;
    
    
public class server {
  int tres;    
    int ff;
  static  Thread tomo = null;
    BufferedReader b = null;
    
    /** Creates a new instance of server */
    public server() {
    
        b = new BufferedReader(new InputStreamReader(System.in));
    }
    
    String readln() throws java.io.IOException {return b.readLine();}
    
    
     public static void main(String[] args)    throws java.io.IOException{
         server r = new server();
         String s = null;
//    TimeThread tomo = new TimeThread();
    

/** final Thread tomo = new Thread() 
{    private boolean running = true;
  
     public void run() 
    { 
while(Thread.currentThread().isAlive()){
    GregorianCalendar d = new GregorianCalendar();
     System.out.println(d.get(Calendar.HOUR_OF_DAY)+d.get(Calendar.MINUTE)+d.get(Calendar.SECOND));
    System.out.println(Thread.currentThread().activeCount());
   try{
   Thread.sleep(1000);
   } catch(Exception e){
   System.out.println(e);
   int tres;    
   
   }
    }        
    
     
    


} 
  };        
 
 *
 */        
         while ((s = r.readln())!= "exit"){
     System.out.println(s);
    
     if (s.equals("start")){
        
 System.out.println("Hi Mike, start Initiated");
 try{  
 TimeThread tomos = new TimeThread();
 tomo = new Thread(tomos);
 tomo.start();
 tomo.isDaemon();
 }catch(Exception e){System.out.println(e);}   }     
   
     if(s.equals("stop")){
     
        tomo.stop();
         System.out.println("Stop Initiatetd");
    
         
     }
   
         
         
      
     }
     
     
     }
     
     
     }
```


```
import java.util.*;
public class TimeThread  implements Runnable{
    private boolean running = true;
    /** Creates a new instance of TimeThread */
    public void run()
    {
    while(running){
    GregorianCalendar d = new GregorianCalendar();
     System.out.println(d.get(Calendar.HOUR_OF_DAY)+d.get(Calendar.MINUTE)+d.get(Calendar.SECOND));
    
   try{
   Thread.sleep(1000);
   } catch(Exception e){
   System.out.println(e);
   
   
   }
    }
    
    
    }
    
    public void stopp(){
    running = false;
    
    }
    }
```


----------



## Beni (13. Dez 2006)

L-ectron-X hat gesagt.:
			
		

> Die stop()-Methode aus Thread is deprecated und sollte nicht mehr verwendet werden.
> Statt dessen sollte mit isInterrupted() und interrupt() gearbeitet werden.
> Beispiele dazu finden sich hier im Forum.


Ich möchte das nochmal wiederholen: "stop" durchbricht den Synchronisationsmechanismus. Ein "stop" an der falschen Stelle kann einen fast unauffindbaren Fehler in das Programm einschleusen, denn erstaunlicherweise wird ein Teil des Codes zwar 100% korrekt sein, aber trotzdem nur zur Hälfte ausgeführt (und halbveränderte Objekte im Speicher sind garnicht lustig).

Oder wolltest du in Zeile 71 was anderes schreiben?

```
tomo.stop();
```

P.S. das wird wohl immer true sein :bae:

```
while(Thread.currentThread().isAlive()){
```

Aber ein "while( !Thread.currentThread().isInterrupted() ){...}" würde der Methode "Thread.interrupt" (welche Thread.stop ersetzt) entgegenkommen :wink:


----------



## Numerobis (3. Jan 2007)

LOL...

Danke sehr


----------

