# 2 Applets, 1 Thread?



## The_S (13. Mai 2005)

Kann es sein, dass 2 Applets auf der selben Website ein und denselben Thread benutzen!? Ich habe nämlich auf meiner Website 2 Applets auf einer Seite angebaut, beide Applets lege ich für jeweils eine bestimmt Zeit schlafen, hab aber dafür keinen extra Thread erzeugt. Wenn ich jetzt beide getrennt ausführe, dann funktionieren sie wunderbar, wenn sie aber zusammen sind, schlafen beide die Zeit des anderen Applets mit.  ???:L  :autsch:


----------



## Spacerat (17. Mai 2005)

Eher unwarscheinlich...

Etwas Quellcode wäre hilfreich.


----------



## The_S (18. Mai 2005)

Naja, man baue zwei einfache Applets (beide ohne extra Threads), das eine lege man für eine gewisse Zeit schlafen und versuche auf den Anderen in dieser Zeit zum Beispiel einen Button zu drücken. Man muss warten bis der Thread aufgewacht ist, bevor die Aktion ausgeführt wird.


----------



## Spacerat (23. Mai 2005)

Hmmmm.....

Für solch eine Aktion ist normalerweise nicht mal ein Thread nötig. Für mouseClicked(), mouseEntered(), mouseExited() usw. implementiert man einen MouseListener. Innerhalb der Methode mouseExited() stoppt man das Applet mittels "this.stop();" und innerhalb der mouseEntered() - Methode startet man es mit "this.start();" wieder. Innerhalb der mouseClicked() - Methode kann man das Applet noch igrendwas ausführen lassen (i.E. "this.showDocument(URL, target);"). Ein Thread wird erst notwendig, wenn das Applet animiert werden oder getimed etwas abfragen soll. Was also hast du vor? Wie gesagt... etwas Code wäre hilfreich.

cu Spacerat


----------



## Wildcard (23. Mai 2005)

@Spacerat   Mindestens ein Thread läuft immer. Hobbit wollte wissen ob sich 2 Applets auf der gleichen Seite einen Thread teilen.


----------



## Spacerat (23. Mai 2005)

@Wildcard: Das ist mir Klar. Hab' offensichtlich die Problematik übelesen.

@Hobbit_Im_Blutrausch: Ich habe bisher angenommen, das du mindestens einen Thread (eben für beide Applets) erzeugt hast. Also. Du hast also lediglich 2 Applets erzeugt, richtig? kein new Thread(this) oder so etwas... (nichts für ungut.. bin nicht ausgeschlafen   ). Das bedeutet, das je Applet ein Thread erzeugt wird. diese Threads teilen sich aber eine ThreadGroup. Per Debug kann man das nachvollziehen. In der Java-Konsole (im Extras-Menue des I.E.) kann man sich mit "t" eine Threadliste ausgeben lassen. Dort bestätigt sich meine Aussage.

cu Spacerat


----------



## The_S (24. Mai 2005)

Hm, dann bremsen sich also Applets (und folglich auch Applikationen!?) beim Gleichzeitigen einsatz gegenseitig aus und das nicht nur beim "Schlafen", sondern auch bei Berechnungen!? Hab ich das so richtig verstanden?


----------



## Spacerat (24. Mai 2005)

Dumm gelaufen, aber so ist das. Und zwar bei jedem neuen Nebenläufer (sprich: Thread). Kurzum, jede JavaApplikation erzeugt einen Thread (wie Wildcard schon weiter oben etwas anders ausgeführt hat -> Ein Thread läuft immer.). Ich hatte ein ähnliches Problem mit einer HoverButton-Klasse, welche Animationen abspielen soll (kann man sich hier ansehen). Die Seite beinhaltet unhemlich viele Applets (jeder Button ist eines), welche ihrerseits noch eigene Threads (für Animationen) erzeugen. Also... um ein Applet schlafen zu legen, genügt es dessen "stop()"-Methode aufzurufen. Innerhalb die ser Applets kann man Threads wie folgt erzeugen, anhalten und wieder starten:

```
public class THApplet extends Applet implements Runnable
{
    private Thread th = null;
    private stopped = true;

    public void start()
    {
        // do what you want
        if(th == null) {
            th = new Thread(this);
            stopped = false;
            th.start();
        }
    }

    public void stop()
    {
        // do what you want
        if(th != null) {
            stopped = true;
            try{
                th.join();
            } catch (InterruptedException e) {
            }
            th = null;
        }
    }

    public void run()
    {
        while(!stopped) {
            // do what you want
            try {
                Thread.sleep((timeout >=10)? timeout : 10L); // dieses SLEEP darf niemals vergessen werden!
                                                                                   // da man anderenfalls den Prozi zu 100% auslastet.
                                                                                   // der TIMEOUT-Wert darf nicht kleiner als 10 sein.
            } catch (InterruptedException e) {
                // th.interrupt() ergibt Access denied Exception!!! Deswegen...
                stop();
            }
        }
    }
}
```

Und während ich hier diesen ganzen Mist verzapfe, fällt mir auf, das es möglicherweise gar keinen Grund gibt, ein Applet schlafen zu legen, wenn es selbst keinen Thread erzeugt. Die "start()"-Methode muß doch eh beendet werden, damit der Ladevorgang der Seite weitergehen kann. Erst wenn das Applet also eine "run()"-Methode hat, macht es überhaupt Sinn dieses innerhalb der "run()"-Methode zu stoppen bzw. über Events zu starten und zu stoppen. Oder sehe ich das jetzt falsch?


----------



## The_S (25. Mai 2005)

Spacerat hat gesagt.:
			
		

> Und während ich hier diesen ganzen Mist verzapfe, fällt mir auf, das es möglicherweise gar keinen Grund gibt, ein Applet schlafen zu legen, wenn es selbst keinen Thread erzeugt. Die "start()"-Methode muß doch eh beendet werden, damit der Ladevorgang der Seite weitergehen kann. Erst wenn das Applet also eine "run()"-Methode hat, macht es überhaupt Sinn dieses innerhalb der "run()"-Methode zu stoppen bzw. über Events zu starten und zu stoppen. Oder sehe ich das jetzt falsch?



Wie meinen?


----------

