Probleme mit Thread beim Applet

cc1990

Grünschnabel
Moin zusammen,
Ich habe so ein kleines Probelem mit Threads
Ich möchte 20 Ip Adressen auf Ihre erreichbarkeit überwachen. Die 20 Ip-Adressen lade ich mir über eine Propertie
Das Pingen der Ip-Adressen funktioniert auch so weit.
Nur die Ip-Adressen sollen in unterschiedlichen Intervallen angepingt werden.
Dieses wollte ich über Threads lösen und den Thread solang schlafen legen, wie die Intervall zeit beträgt. Mit einer IpAdress und einem Thread (sleeper) Funktioniert das auch wunderbar. Aber wenn ich dann zwei Ip-Addressen nehme nimmt mein Applet-Java Programm nur den ersten Sleeper und beachten den zweiten gar nicht.
Hab ihr eine Idee wo das Problem liegen könnte oder ich das lösen kann?

Code:
iimport java.applet.*;
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class Threads1 extends Applet implements Runnable {

   int width, height;
   int i = 2;
   Thread t = null;
   boolean threadSuspended;

   // Executed when the applet is first created.
   public void init() {
      System.out.println("init(): begin");
      width = getSize().width;
      height = getSize().height;
      System.out.println("init(): end");
   }

   // Executed when the applet is destroyed.
   public void destroy() {
      System.out.println("destroy()");
   }

   // Executed after the applet is created; and also whenever
   // the browser returns to the page containing the applet.
   public void start() {
      System.out.println("start(): begin");
      if ( t == null ) {
         System.out.println("start(): creating thread");
         t = new Thread( this );
         System.out.println("start(): starting thread");
         threadSuspended = false;
         t.start();
      }
      else {
         if ( threadSuspended ) {
            threadSuspended = false;
            System.out.println("start(): notifying thread");
            synchronized( this ) {
               notify();
            }
         }
      }
      System.out.println("start(): end");
   }

   // Executed whenever the browser leaves the page containing the applet.
   public void stop() {
      System.out.println("stop(): begin");
      threadSuspended = true;
   }

   // Executed within the thread that this applet created.
   public void run() {
      System.out.println("run(): begin");
      try {
         while (true) {
            System.out.println("run(): awake");
            
            myThread(1);
            repaint();
			
			myThread(2);
            repaint();
            
            
            myThread(3);
            repaint();
			
			myThread(4);
            repaint();
            
            
            myThread(5);
            repaint();
			
			myThread(6);
            repaint();
            
            myThread(7);
            repaint();
			
			myThread(8);
            repaint();
            
            myThread(9);
            repaint();
			
			myThread(10);
            repaint();
            
            myThread(11);
            repaint();
			
			myThread(12);
            repaint();
            
            myThread(13);
            repaint();
			
			myThread(14);
            repaint();
            
            myThread(15);
            repaint();
			
			myThread(16);
            repaint();
            
            
            myThread(17);
            repaint();
			
			myThread(18);
            repaint();
            
            
            myThread(19);
            repaint();
			
			myThread(20);
            repaint();
            
          }
      }
      catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
      System.out.println("run(): end");
   }

   // Executed whenever the applet is asked to redraw itself.
   public void paint( Graphics gr) {
		setSize(800, 900);
		for (int counter= 1; counter<= 20; counter++){
	    gr.setColor(Color.orange);
			Properties properties = new Properties();
			try {
				properties.load( new FileInputStream( "./Conf.properties" ) );
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				String ipAddress = properties.getProperty("ipAddress"+counter);
				String maxstr = properties.getProperty("max"+counter);
				Long maxLong = Long.valueOf(maxstr);
				Integer maxInt = Integer.valueOf(maxstr);
				String tmStr = properties.getProperty("tm"+counter);
				Long tm = Long.valueOf(tmStr);
				Integer tmInt = Integer.valueOf(tmStr);
				
				int pos1=10;
				int pos2= 0;
				int pos3= 300;
				try {
				if (tm<=maxLong){
					Integer wert;
					wert= (100/maxInt)*tmInt;
					
					if ((counter%2)==0){
						int x = counter-1;
						gr.setColor(Color.black);
						pos2= (10*x)+(10*x)+(10*(x-2));
						gr.drawRect(pos3, pos2, 100, 50);
						gr.fillRect(pos3, pos2, wert, 50);
						gr.drawString("IP-Address: "+ipAddress, 420, pos2);
						gr.drawString("Ping Zeit: "+tmStr, 420, (pos2+10));
						
					}else{
						gr.setColor(Color.black);
						pos2= (10*counter)+(10*counter)+(10*(counter-2));
						gr.drawRect(pos1, pos2, 100, 50);
						gr.fillRect(pos1, pos2, wert, 50);
						gr.drawString("IP-Address: "+ipAddress, 120, pos2);
						gr.drawString("Ping Zeit: "+tmStr, 120, (pos2+10));
					}
				}
				else{
					if((counter%2)==0){
						int x = counter-1;
						gr.setColor(Color.red);
						pos2= (10*x)+(10*x)+(10*(x-2));
						gr.drawRect(pos3, pos2, 100, 50);
						gr.fillRect(pos3, pos2, 100, 50);
						gr.drawString("IP-Address: "+ipAddress, 420, pos2);
						gr.drawString("Ping Zeit: "+tmStr, 420, (pos2+10));
						
					}else{
						gr.setColor(Color.red);
						pos2= (10*counter)+(10*counter)+(10*(counter-2));
						gr.drawRect(pos1, pos2, 100, 50);
						gr.fillRect(pos1, pos2, 100, 50);
						gr.drawString("IP-Address: "+ipAddress, 120, pos2);
						gr.drawString("Ping Zeit: "+tmStr, 120, (pos2+10));
						
					}
					
				}
				}
				catch (Exception e) {
					System.err.println(e.toString());
				}
		}
	}
   
   public void myThread(int conf) throws IOException{
		final Properties properties = new Properties();
		properties.load( new FileInputStream( "./Conf.properties" ) );
		String ipAddress = properties.getProperty("ipAddress"+conf);
		InetAddress host = InetAddress.getByName(ipAddress);
		System.out.println("IP: "+host.getHostAddress());
		int port = 80;
		long        tm   = System.nanoTime();
		Socket      so   = new Socket(host, port);
		so.close();
		tm = (System.nanoTime() - tm) / 1000000L;
		String maxstr = properties.getProperty("max"+conf);
		Long maxLong = Long.valueOf(maxstr);
		String tmStrZeit = String.valueOf(tm);
		FileWriter writer = new FileWriter("./Conf.properties");
		String tmKey = "tm"+conf;
		if (tm <= maxLong){
			properties.setProperty(tmKey, tmStrZeit);
			properties.store(writer, "test");
			System.out.println(tmStrZeit);
			System.out.println(maxLong);
				
		}else{
			properties.setProperty(tmKey, tmStrZeit);
			properties.store(writer, "test");
			System.out.println(tmStrZeit);
			System.out.println(maxLong);
			String counter = properties.getProperty("counter"+conf);
			Integer counterInt = Integer.valueOf(counter);
			if (counterInt== 3){ 
				 String username = "pingalarm@intelicom.de";
		        String password = "v5dke3nx";
		        String senderAddress ="Noc@one-4-one.de";//someone@web.de
		        String recipientsAddress = ""; //somereceiver@web.de
		        String subject = "Warning, die Ping Zeit wurde überschritten";
		        String text = "Die Ping Zeit vom Server"+ ipAddress+ "wurder überschritten.";
		        String smtpHost = "smtp.web.de";
		        
		        new MyThread(conf).sendMail(smtpHost, username, password, senderAddress, recipientsAddress, subject, text);
		        counterInt = 0;
		        String counterString = String.valueOf(counterInt);
				properties.setProperty("counter", counterString);
			}else if (counterInt>3) {
				String username = "pingalarm@intelicom.de";
		        String password = "v5dke3nx";
		        String senderAddress ="Noc@one-4-one.de";//someone@web.de
		        String recipientsAddress = ""; //somereceiver@web.de
		        String subject = "Achtung, die Ping Zeit wurde überschritten";
		        String text = "Die Ping Zeit vom Server"+ ipAddress+ "ist immer noch überschritten. Es ist schon der"+ counterInt + "versuch";
		        String smtpHost = "smtp.web.de";
		        
		        new MyThread(conf).sendMail(smtpHost, username, password, senderAddress, recipientsAddress, subject, text);
		        counterInt = 0;
		        String counterString = String.valueOf(counterInt);
				properties.setProperty("counter", counterString);
			}
			else{
				counterInt++;
				String counterKey = "counter"+conf;
				String counterString = String.valueOf(counterInt);
				properties.setProperty(counterKey, counterString);
			}
		}
		String intervall = properties.getProperty("intervall"+conf);
		long temp_long = Long.parseLong(intervall);
		
		try {
			Thread.currentThread().sleep(temp_long);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void sendMail(String smtpHost,String username,String password,String senderAddress,String recipientsAddress,String subject,String text ){
		MailAuthenticator auth = new MailAuthenticator(username, password);
		
		Properties properties = new Properties();
		
		// Den Properties wird die ServerAdresse hinzugefügt
		properties.put("mail.smtp.host", smtpHost);
		
		// !!Wichtig!! Falls der SMTP-Server eine Authentifizierung
		// verlangt
		// muss an dieser Stelle die Property auf "true" gesetzt
		// werden
		properties.put("mail.smtp.auth", "true");
		
		// Hier wird mit den Properties und dem implements Contructor
		// erzeugten
		// MailAuthenticator eine Session erzeugt
		Session session = Session.getDefaultInstance(properties, auth);
		
		try {
		    // Eine neue Message erzeugen
		    Message msg = new MimeMessage(session);
		
		    // Hier werden die Absender- und Empfängeradressen gesetzt
		    msg.setFrom(new InternetAddress(senderAddress));
		    msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
		            recipientsAddress, false));
		
		    // Der Betreff und Body der Message werden gesetzt
		    msg.setSubject(subject);
		    msg.setText(text);
		
		    // Hier lassen sich HEADER-Informationen hinzufügen
		    msg.setHeader("Test", "Test");
		    msg.setSentDate(new Date( ));
		
		    // Zum Schluss wird die Mail natürlich noch verschickt
		    Transport.send(msg);
		
		}
		catch (Exception e) {
		    e.printStackTrace( );
		}
		}
		
		class MailAuthenticator extends Authenticator {
		
		/**
		 * Ein String, der den Usernamen nach der Erzeugung eines
		 * Objektes<br>
		 * dieser Klasse enthalten wird.
		 */
		private final String user;
		
		/**
		 * Ein String, der das Passwort nach der Erzeugung eines
		 * Objektes<br>
		 * dieser Klasse enthalten wird.
		 */
		private final String password;
		
		/**
		 * Der Konstruktor erzeugt ein MailAuthenticator Objekt<br>
		 * aus den beiden Parametern user und passwort.
		 * 
		 * @param user
		 *            String, der Username fuer den Mailaccount.
		 * @param password
		 *            String, das Passwort fuer den Mailaccount.
		 */
		public MailAuthenticator(String user, String password) {
		    this.user = user;
		    this.password = password;
		}
		
		/**
		 * Diese Methode gibt ein neues PasswortAuthentication
		 * Objekt zurueck.
		 * 
		 * @see javax.mail.Authenticator#getPasswordAuthentication()
		 */
		protected PasswordAuthentication getPasswordAuthentication() {
		    return new PasswordAuthentication(this.user, this.password);
		}
}
}
 
Zuletzt bearbeitet:
Hallo,

sieht mir nach einem klassischen Deadlock aus:

Java:
               synchronized( this ) {
                  while ( threadSuspended ) {
                     System.out.println("run(): waiting");
                     wait();
                  }
               }

Die kritische Sektion wird nach dem ersten Aufruf nie mehr verlassen, da der aktuelle Thread wartet - auf was eigentlich?
 
Das ist noch ein überbleibse was weg kann. Das Problem ist, dass auf dem ersten sleeper erkannt wird aber der zweite komplett ignoriert wirde
 
Jetzt habe ich das ding mit zwei IP-Adressen eigenermaßen zum laufen gebracht.
Er hat läuft noch nicht Parallel sondern hintereinander.
Aber nun taucht an adauern diese Fehlermenlung auf:

Exception in thread "AWT-EventQueue-1" java.lang.NumberFormatException: null
at java.lang.Long.parseLong(Unknown Source)
at java.lang.Long.valueOf(Unknown Source)
at Threads1.paint(Threads1.java:161)
at java.awt.Container.update(Unknown Source)
at sun.awt.RepaintArea.updateComponent(Unknown Source)
at sun.awt.RepaintArea.paint(Unknown Source)
at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Ich weiß leider nicht warum er da eine Null da widererbekommt.
 
Ich weiß nicht, welcher Code in Zeile 161 steht, offensichtlich hat sich dein Code mittlerweile geändert, denn in 161 ist kein Long.valueOf()-Call. Es muss einer der Parameter aus der Conf.properties sein, der da fehlt.

Java:
                String ipAddress = properties.getProperty("ipAddress"+counter);
                String maxstr = properties.getProperty("max"+counter);
                Long maxLong = Long.valueOf(maxstr);
                Integer maxInt = Integer.valueOf(maxstr);
                String tmStr = properties.getProperty("tm"+counter);
                Long tm = Long.valueOf(tmStr);
                Integer tmInt = Integer.valueOf(tmStr);

Du solltest vor dem Benutzen von valueOf() auf null prüfen:

Java:
                String ipAddress = properties.getProperty("ipAddress"+counter);
                String maxstr = properties.getProperty("max"+counter);
                Long maxLong = null;
                Integer maxInt = null;
                if( maxstr == null )
                    System.out.println("Kein Wert für max" + counter);
                else
                {
                    maxLong = Long.valueOf(maxstr);
                    maxInt = Integer.valueOf(maxstr);
                }
                String tmStr = properties.getProperty("tm"+counter);
                Long tm = null;
                Integer tmInt = null;
                if( tmStr == null )
                    System.out.println("Kein Wert für tm" + counter);
                else
                {
                    tm = Long.valueOf(tmStr);
                    tmInt = Integer.valueOf(tmStr);
                }
 
OK, danke für die schnelle Antwort. ICh füge das mal in Code hin zu obwolh in die Properties nicht leer sind, das war auch zu erst meine Vermutung.

Wie kann ich Theards prallel laufen parallel lassen?
Zu Zeit ist es so, der erste Thrad ins slepp geht und wenn diese Zeit vorbei ist ersten zweiten Thread öffnet.
 
Sobald man einen Thread instanziiert und mittels start() loslaufen lässt, hat man bereits parallele Ausführung. Es existieren dann nämlich schon 2 Threads (der Haupt-Thread ist auch ein solcher).

Wenn du alle Threads nacheinander direkt einfach startest, laufen alle parallel.
 
Wenn ich dir Threads hinter einander Starte funktioniert das nicht mit dem sleep oder muss die sleep auch unter einader stehen
 
Wozu willst du denn ein Sleep einbauen? Was soll das Sleep() bewirken? Entweder du willst die Threads laufen lassen oder nicht, ein Sleep ist überhaupt nicht sinnvoll.
 
Zurück