# Threads einbinden



## phil21xx (10. Jan 2010)

Hallo an alle,

Habe ein kleines Problem. Wie kann ich denn meinen Server (siehe unten) ganz simpel über EINEN Thread starten lassen und dazu noch einen ZWEITEN Thread einpflegen der einfach nur schläft oder "die Sekunden zählt"!


```
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
  

public class ServerMahnung extends UnicastRemoteObject implements SCInterface  {
    
    /** Creates a new instance of ServerMahnung */
    public ServerMahnung() throws RemoteException {
    }
    
 
 
    
    public String getMahnung (String x) throws RemoteException{
  
    return  "Mahnungshöhe :" + x + " * 1.03 ";
}
    
  
 
 
 
public static void main (String[]args){
    
    try{
        
        ServerMahnung servermahnung = new ServerMahnung();
        Naming.rebind("ServerMahnung", servermahnung);
        System.out.println("Server ist funktionstüchtig!");
    }
    
    catch(Exception ex){
        ex.printStackTrace();
    }
}
}
```

Vielen Dank im Voraus
phil21xx


----------



## javimka (10. Jan 2010)

Um Sekunden zu zählen könntest du einen Timer verwenden. Ist zwar seltsam, das Swing Packet hier zu verwenden, aber so sollte es gehen:
Folgendes in den Konstruktor von ServerMahnung:

```
new Timer(1000,new ActionListener() {
  public void actionPerformed(ActionEvent event) {
    counter++;
  }
}).start();
```

counter ist dann eine Membervariable von ServerMahnung.


----------



## javimka (10. Jan 2010)

Was genau soll parallel ausgeführt werden? In deiner Klasse gibt es ja keine Methode, ausser dem Konstruktor und getMahnung. Soll bereits der Konstruktor parallel zur main-Methode ausgeführt werden?

Vielleicht ist es ja das, was du suchst.

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Random;

import javax.swing.Timer;

public class ServerMahnung extends UnicastRemoteObject implements
		SCInterface, Runnable {

	private int counter = 0;

	/** Creates a new instance of ServerMahnung */
	public ServerMahnung() throws RemoteException {
		new Timer(1000, new ActionListener() {
			public void actionPerformed(ActionEvent event) {
				counter++; // zähle die Sekunden
			}
		}).start();
		new Thread(this).start(); // starte run() parallel
	}

	public String getMahnung(String x) throws RemoteException {

		return "Mahnungshöhe :" + x + " * 1.03 ";
	}

	public void run() {
		System.out.println("run startet parallel und macht irgendwas");
		Random rand = new Random();
		while(true) {
			try {
				System.out.println("Seit dem Start sind "+counter+" Sekunden vergangen");
				Thread.sleep(rand.nextInt(5000)+500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {

		try {

			ServerMahnung servermahnung = new ServerMahnung();
			Naming.rebind("ServerMahnung", servermahnung);
			System.out.println("Server ist funktionstüchtig!");
		}

		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}
```


----------



## phil21xx (10. Jan 2010)

Danke, dass ist schonmal super.

Die Ausgabe erfolgt nun aber nicht über meinen RMI Server - rmiregistry.


----------



## javimka (10. Jan 2010)

Das musst du nun in die run() Methode anstelle von meinem Code schreiben.


----------



## phil21xx (10. Jan 2010)

javimka füg das bitte mal in meinen code ein, damit ich weiss wie du das meinst - bekomme immer einen Fehler.


----------



## javimka (10. Jan 2010)

Ich weiss nicht, wie du das über deinen RMI Server ausdrucken willst.
Aber du siehst doch sicher, dass in meiner run() Methode mehr oder weniger Unsinn steht, der nur die Funktionsweise demonstrieren soll. Entferne diesen Code und schreibe das ins run(), was wirklich passieren soll.

Was kriegst du denn für einen Fehler?


----------



## phil21xx (11. Jan 2010)

Kann ich nicht den Server über die run() Methode starten lassen und nicht in meiner public static void main(String[] args)..:

Das wäre das gewünschte, als meinen Code (siehe unten) durch den "Unsinn" ersetzen.


```
ServerMahnung servermahnung = new ServerMahnung();
Naming.rebind("ServerMahnung", servermahnung);
System.out.println("Server ist funktionstüchtig!");
```

Mit deinem Coding kann ich momentan nichtmehr mit meiner GUI auf über meine RMI Client Server Anwendung etwas versenden.

Es wird im Interpreter folgendes angezeigt:

run startet parallel und macht irgendwas
Seit dem Start sind 0 Sekunden vergangen
Server ist funktionstüchtig!
Seit dem Start sind 4 Sekunden vergangen
Seit dem Start sind 7 Sekunden vergangen
Seit dem Start sind 10 Sekunden vergangen
Seit dem Start sind 15 Sekunden vergangen
.
.
.

Davor mit dem alten Coding wurde mir über die C:\WINDWOS\system32\cmd.exe

Server ist funktionstüchtig!

ausgegeben und man konnte Daten versenden.


Problem:

Es sollte also nur der Serveraufruf/aufbau über die run() Methode gestartet werden


```
ServerMahnung servermahnung = new ServerMahnung();
Naming.rebind("ServerMahnung", servermahnung);
System.out.println("Server ist funktionstüchtig!");
```


----------



## javimka (11. Jan 2010)

Lösche doch meinen Code und setze deinen an dessen Stelle, innerhalb der main-Methode. Dann funktioniert alles wie vorher, nur dass es nicht mehr der main-Thread ist, der das ausführt, sondern ein Neuer.


----------



## phil21xx (11. Jan 2010)

Genau das habe ich ja gemacht, aber dann gibt er mir einen Fehler in der main Methode vorhanden ist.

Kannst du das mal kurz einsetzen?


----------



## javimka (11. Jan 2010)

Was für ein Fehler denn?

In der main müsstest du nur noch schreiben: [c]new ServerMahnung();[/c]


----------



## Sotsch (11. Jan 2010)

```
Thread t1 = new Thread(new Runnable(){
  public void run() {
     while(true){
     }
  }
});

t1.start();
```

So kann man ganz einfach mehrere Threads erstellen


----------

