Andere Methoden aus einem Thread starten

Andron

Erfahrenes Mitglied
Hallo,
ich kämpfe schon seit mehreren Tagen mit dem Problem.
Ich möchte aus einem Thread in dem die Rechnerzeit läuft in bestimmten Zeitintervallen andere Methoden ausführen.
Z.B. jede 5 sek. soll ein Pixel dargestellt werden usw.
Ich habe schon alles mögliche versucht, klappt nicht. In 3 Wochen muss das Projekt fertig sein und ich komme nicht voran.
Hier ist der Ausschnitt aus dem Programm:
Code:
 while (true) {
                synchronized (v) {
                    Date dd = null;
                    dd = new java.util.Date();
                    int st = dd.getHours();
                    int min = dd.getMinutes();
                    int sek = dd.getSeconds();

                    System.out.println(sek);
                    try {
                        this.sleep(1000);
                    } catch (InterruptedException ex) {
                    }
                    if (sek % 5 == 0) {
                        String s="test";
                        v.add(s);
                        v.notify();
                        System.out.println("Produzent erzeugte " + s);
                        System.out.println("$");
                        // mensch.OnTimer();
                        // disp.Zeichnen(10, 10);
                        // disp.repaint();

                    }
Das Programm läuft, solange die Methode nicht verlassen wird. Wenn ich eine der drei letzten auskommentierten Zeilen ausführen will, bekomme ich die Fehlermeldung:

Exception in thread "Thread-3" java.lang.NullPointerException
at insulinsimulator.Gui_PumpeDisplay$zeit.run(Gui_PumpeDisplay.java:201)


Bitte um Hilfe.

Gruß
Andron
 
Hallo Andron,

es wird eine Nullpointerexception geworfen. Eine Mögliche Ursache wäre, das du ein Objekt noch nicht erzeugt hast. In der Fehlermeldung steht die Zeilennummer 201. Da ich nicht weiß zu welcher dieser gehört, könnte der Fehler sowohl von mensch als auch von disp resultieren.

Beispielsweise:
Mensch mensch; // Das wäre Falsch, da Refrenz erstellt aber kein Objekt erzeugt
Mensch mensch = new Mensch(); // Richtig
mensch.OnTimer();

und

Display disp; // Falsch
Display disp = new Display(); // Richtig
disp.Zeichnen(10, 10);
disp.repaint();

Da ich die Klassennamen für mensch und disp nicht weiß, hab ich mal geraten, du musst natürlich die korrekten Klassenbezeichnungen verwenden.


Vg Erdal
 
Da der Code uns hier nicht weiterhilft um herauszufinden wo du etwas nicht initialisiert hast, kann ich hier nur mit dem Orakel Modus arbeiten
[orakel modus an]
if(v==null)
System.out.println("Hab dich du dumme Nuss!");
v.add(s);
v.notify();
[/orakel modus aus]


So würd ich mal orakeln ;-) oder den Debugger Breakpoint hinsetzen :)
 
Klasse Display:
Code:
static Display display;

    public static Display getDisplay()
    {
        if(display == null)
      display = new Display();

    return display;

    }
... hier wird ein Objekt vom Typ Display erstellt und dafür gesorgt, dass es immer nur EIN Objekt dieses Typs exisitert.
Code:
public void run() {
            disp.getDisplay(); 
            while (true) {
                synchronized (v) {
                    Date dd = null;
                    dd = new java.util.Date();
                    int st = dd.getHours();
                    int min = dd.getMinutes();
                    int sek = dd.getSeconds();

Mit Display disp; und folgend disp.getDisplay wird der Objekt angelegt und zurückgegeben. Aus allen anderen Stellen des Programms kann ich auf die Methoden und Attribute des Display-Objekts zugreifen, aber nicht aus dem Thread.
Ist es im Allgemeinen möglich aus einem Thread eine Methode eines "entfernten" Objekts aufzurufen?
 
flashray hat gesagt.:
Ein "final" könnte dir eventuell helfen.

Also: final Display disp;


Vg Erdal

scheint nicht zu klappen, kommt die Fehlermeldung: "Gui_PumpeDisplay.java": Variable disp ist nicht initialisiert worden in Zeile 65, Spalte 6
 
Wie wärs mit einwenig mehr Code. So bruchstückhaft kann man das schlecht erraten. Könntest du bitte die relevanten Klassen vollständig posten.


Vg Erdal
 
Code:
 Klasse Gui_PumpeDisplay 
public class Gui_PumpeDisplay extends JFrame{
   
    Display disp;
    Mensch mensch;
    int stunde;
    int minute;
   static int sekunde;
        
    public Gui_PumpeDisplay() {
        try {
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void MainFenster() throws IOException {
        disp.getDisplay();
        
        Vector v = new Vector();
       
        zeit z=new zeit(v);
        sheduler s=new sheduler(v);
        z.start();
        s.start();
  }

  public void setZeit(int s)
  {
            System.out.println("bekommen: "+s);
  }
   
    class zeit extends Thread
    {
        int var=0;
       private Vector v;
       public zeit(Vector v)
       {
           this.v=v;
       }

        public void run() {
            
            while (true) {
                synchronized (v) {
                    Date dd = null;
                    dd = new java.util.Date();
                    int st = dd.getHours();
                    int min = dd.getMinutes();
                    int sek = dd.getSeconds();

                    var = sek;
                    int sek1 = dd.getSeconds();

                    System.out.println(sek);
                    try {
                        this.sleep(1000);
                    } catch (InterruptedException ex) {
                    }
                    if (sek % 5 == 0) {
                        String s="test";
                        var = var + 1;

                        v.add(s);
                        v.notify();
                        System.out.println("Produzent erzeugte " + s);


                        System.out.println("$");
                        // mensch.OnTimer();

                         disp.Zeichnen(10, 10);  <-- das verursacht Fehler
                     // disp.repaint();

                    }
                    System.out.println(st + ":" + min + ":" + sek);
                    
                }
            }
        }
}

Klasse Display

public class Display extends JPanel {

    private static int x1;
    private static int y1;
    private static int x2;
    private static int y2;

    int hoch;
    int breit;

    boolean fl = false;

    public Display() {
        super();
        try {
            jbInit();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    static Display display;

    public static Display getDisplay()
    {
        if(display == null)
      display = new Display();

    return display;

    }


     public boolean Zeichnen(int zeit, double zuckerWert)  {


     double puff=zuckerWert;

     System.out.println("............. zeichne.............");

     x1=zeit;
     x2=x1;
     y1=(int) puff;
     y2=y1;
     repaint();
     return (true);

    }

    public void paintComponent(Graphics g) {

        double y;
        int yy;
        int xx;

        super.paintComponent(g);
        int h = getHeight();
        int w = getWidth();
        int mitte = h / 2;

        g.setColor(Color.black);
        //   g.drawLine(x1,y1,x2,y2);
        g.drawLine(x1, y1, x2, y2);

    }

    private void jbInit() throws Exception {

        //setVisible(true);
    }

}
 
Hallo Andron,

du initialisierst disp in der Methode MainFenster. Dieser wird aber nicht aufgerufen, d.h. disp wird somit nicht initialisiert. So kann das natürlich nicht funktionieren. Bevor du disp nutzt, muss mindestens einmal disp.getDisplay() aufgerufen werden, das geschieht hier aber nicht.


Vg Erdal
 
Hallo Andron,

hier ein funktionierendes Beispiel:

Java:
public class Klasse {

	private static Klasse klasse;

	public static Klasse getKlasse() {
		if (klasse == null)
			klasse = new Klasse();
		return klasse;
	}

	public void testAufruf() {
		System.out.println("Testaufruf ist erfolgreich!");
	}
}

Java:
public class AndereKlasse {

	private static Klasse klass;

	public static void main(String[] args) {
		klass = Klasse.getKlasse();

		new Thread() {
			public void run() {
				while (true) {
					klass.testAufruf();
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();
	}
}


Vg Erdal
 
Zurück