Warten bis die Länge eines Strings nicht mehr 0 ist

Viewty-Fan

Mitglied
Hallo,
ich habe ein Problem. Ich bekomme als Ausgabe einen von 4 verschiedene Strings. Jetzt brauche ich eine Methode, die solange wartet bis die Länge eines dieser 4 Strings nicht mehr 0 ist. Wie kann man das verwirklichen?

Danke für die Hilfe
Viewty-Fan
 
Auf jeden Fall brauchst du mal einen extra Thread der schaut ob sich der String schon geändert hat... zb
Java:
public class Test {

   private String myString;

   public Test() {
      myString = "";
   }

   public void doIt() {
      System.out.println("starting doIt");
      while (myString.length() == 0) {
         try {
            Thread.sleep(100);
         } catch (InterruptedException e) {
         }
      }
      System.out.println("did it: " + myString);
   }

   public String getMyString() {
      return myString;
   }

   public void setMyString(String myString) {
      this.myString = myString;
   }

   public static void main(String[] args) throws InterruptedException {
      final Test test = new Test();

      new Thread(new Runnable() {
         public void run() {
            test.doIt();
         }
      }).start();

      System.out.println("jetzt warten mir mal 5 Sekunden");
      Thread.sleep(5000);
      System.out.println("fertig");
      test.setMyString("mein String");
   }

}
 
Hi erstmal erzählst du vielleicht was der Sinn der Sache ist🙂. Ich hab mal schnell was zusammengeschrieben(Da musst du aber in über einem anderen Thread die Änderungen an den Strings vornehmen lassen)(lässt sich noch schöner mit nem String[] lösen, aber ich glaube sowieso nicht, dass dir das so viel weiter hilft)
Java:
        String stringI = "";
        String stringII = "";
        String stringIII = "";
        String stringIV = "";
        while(true){
            if (stringI.length() != 0 || stringII.length() != 0 || stringII.length() != 0 || stringIV.length() != 0) {
                break;
            } else{
                try {
                    Thread.sleep(10);
                } catch (InterruptedException ex) {
                }
            }
        }
mfg
Eldorado
 
Hi erstmal erzählst du vielleicht was der Sinn der Sache ist🙂


Klar 🙂
Wir haben vor kurzem in der Schule mit Java begonnen. Jetzt sollen wir einen eingegebenen Text nur ausgeben, rückwärts schreiben und darauf prüfen ob es ein Palindrom ist. Falls es keine Palindrom ist es zu einem machen. Ich habe das mit Buttons und ActionListener realisiert. Jetzt geben diese ActionListener verschiedene Strings aus. Diese muss ich jetzt weiter verwenden, weil unser Lehrer will, dass JavaKarol (Programm zu Einstieg in das Programmieren) diese Strings schreibt.

Jetzt habe ich den Code mal so angewendet. Das klappt aber noch nicht richtig... Das liegt daran, dass ich den Code nicht komplett verstehe. Könnt ihr mir erklären wo die Methoden "karol.StartPosition(); und karol.write(String); " hinmüssen. Diese Methoden sollen angewandt werden, wenn ein String geschrieben worden ist.

Java:
        String name = "";
        String Turn = "";
        String Palin2 = "";
        String MakePalindrom = "";
        while(true){
            if (name.length() != 0 || Turn.length() != 0 || Palin2.length() != 0 || MakePalindrom.length() != 0) {
                break;
            } else{
                try {
                    Thread.sleep(10);
                } catch (InterruptedException ex) {
                    karol.StartPosition();
                    karol.write(MakePalindrom);
                }
            }
        }

Falls euch der gesamten Code helfen würde meldet euch, dann lade ich ihn auch noch hoch.

Viewty-Fan
 
Der catch-block wird hier nur dann ausgeführt, wenn etwas beim warten schiefgeht(passiert so gut wie nie). Aber erstmal was grundsätzliches: Du benutzt doch einen Button um die Prüfung zu starten oder? warum musst du dann auf Eingaben warten, wenn dir der ActionListener sagt, wenn der Benutzer die Auswertung haben will? Aber vielleicht postest du wirklich mal deinen Code(ist hoffentlich nicht zu viel 😉)
 
Naja, wenn das ding eine GUI hat, sehe ich keine Notwendigkeit für so einen Überwachungsthread, aber ich würde hier 2 Dinge beachten:
a) Den Thread als Daemon, sonst läuft der weiter, auch wenn das Programm beendet ist
b) synchronisierung

Hier mal mein Vorschlag:
Java:
public class Waiter
{
	private String str	= "";
	
	public synchronized void setStr(String string)
	{
		if(string != null)
			str	= string;
	}
	
	public synchronized String getStr()
	{
		return str;
	}
	
	public void checkString()
	{
		Thread th	= new Thread()
		{
			public void run() 
			{							
				while(!isInterrupted())
				{					
					if(getStr().length() > 0)
					{
						System.out.println("JIHAA!");
						interrupt();
					}
					try
					{
						Thread.sleep(10);
					}
					catch(InterruptedException e)
					{						
						break;
					}
				}
			};
		};
		
		th.setDaemon(true);
		th.start();
	}
	
	public static void main(String[] args)
	{
		Waiter waiter	= new Waiter();
		System.out.println("-- Start");
		waiter.checkString();
		try
		{	
			System.out.println("Input: " + waiter.getStr());
			Thread.sleep(5000);
		}
		catch(InterruptedException e)
		{
			
		}
		
		waiter.setStr("abcdeftg");
		System.out.println("-- Ende");
	}
}

MFG

Tomate_Salat
 
Zuletzt bearbeitet von einem Moderator:
Hier ist mein Code...

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.FlowLayout;
import java.awt.Button;

 
public class Arbeit_Test
{

    WELT meineWelt;
    SCHREIBER karol;
    String MakePalindrom;
        String name;
        TextField Input=new TextField ("Eingabe",20);
        TextField Output= new TextField ("Ausgabe",20);
        Frame Fields= new Frame ("AIT-Projekt");
        Button close = new Button ("Beenden");
        Button Spiegeln = new Button ("Spiegeln");
        Button Turn = new Button ("Drehen");
        Button Palindrom = new Button ("Palindrom");

    /**
     * Konstruktor der Klasse ARBEIT
     * 
     * Erzeugt die f¸r die Methode Ausfuehren() erforderlichen 
     * Objekte der Klassen WELT und ROBOTER
     */
    public Arbeit_Test()
    {
        meineWelt = new WELT(50,10,10);
        karol = new SCHREIBER(meineWelt); 
        
           
    }
    

public void schreiben(){
close.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.exit(0);
            }
        });
            Spiegeln.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    name=Input.getText();
                    Output.setText(name);
            }
        });
            Turn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String Turn = Input.getText();
                    Turn = new StringBuffer(Turn).reverse().toString();
                    Output.setText(Turn);
            }
        });
            Palindrom.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String Palin = Input.getText();
                    String Palinreverse= Input.getText();
                    String Palin2 = Palin.replaceAll(" ", "");
                    Palinreverse =new StringBuffer(Palin2).reverse().toString();
                    if (Palinreverse.equals(Palin2)){
                    Output.setText(Palin2);
                    }
                    else {
                    MakePalindrom= Palin2 + Palinreverse;
                    Output.setText(MakePalindrom);
                    }
            }
        });
        
            Fields.add(Input);
            Fields.add(Output);
            Fields.setSize(200,300);
            Fields.setVisible(true);
            Fields.add(close);
            Fields.add(Spiegeln);
            Fields.add(Turn);
            Fields.add(Palindrom);
            Input.setBounds(0,25,195,55);
            Output.setBounds(0, 85, 195, 55);
            Output.setEditable(false);
            Output.setBackground(Color.RED);
            close.setBounds(0, 150, 100, 50);
            Spiegeln.setBounds(0, 200, 100, 50);
            Palindrom.setBounds(100, 200, 100, 50);
            Turn.setBounds(100, 150, 100,50);
            
            
        String name = "";
        String Turn = "";
        String Palin2 = "";
        String MakePalindrom = "";
        while(true){
            if (name.length() != 0 || Turn.length() != 0 || Palin2.length() != 0 || MakePalindrom.length() != 0) {
                break;
            } else{
                try {
                    Thread.sleep(10);
                } catch (InterruptedException ex) {
                }
                karol.StartPosition();
                karol.write(MakePalindrom);
            }
        }
          
karol.StartPosition();
karol.write(MakePalindrom);
}


Vielleicht hilft das euch weiter...

@Tomate_Salat Dein Code ist mir etwas zu kompliziert... Wenn da mein Lehrer fragt, was ich da geschrieben habe habe ich ein Problem😉
 
(Multi)Threading ist kompliziert und sollte mit viel bedacht geregelt werden. Wenn dein Lehrer fragt: Warum hast du da ein Thread.sleep(10) drin, wäre ich mir nicht sicher, ob du darauf die antwort weist ;-) (ganz einfach: ohne das würde mind. ein Prozessorkern eine Auslastung von 100% haben).

Du machst es dir aber viel zu kompliziert. Arbeite mit Listeneren: drückt man auf den Button, dann führst du eine Prüfung durch und fertig, dafür brauchste absolut kein Multithreading.

Edit
Btw ich überfliege gerade deinen Code. Gewöhne dir gleich die richtigen Konventionen an:
Deine Klasse [c]Arbeit_Test[/c] schreibt man laut Konvention [c]ArbeitTest[/c]
[c]TextField Input[/c] variablen und referenzen kleinschreiben.
 
Zuletzt bearbeitet von einem Moderator:
Dann hast du aber meinen Beitrag nicht aufmerksam gelesen:
Du benutzt doch einen Button um die Prüfung zu starten oder?warum musst du dann auf Eingaben warten, wenn dir der ActionListener sagt, wenn der Benutzer die Auswertung haben will?
Aber vielleicht war es auch ein bisschen umständlich formuliert 😀
mfg
Eldorado
 

Zurück
Oben