Start des zweiten Threads erst nach Beenden des ersten Threads

Sherry

Aktives Mitglied
Hallo,

ich möchte mit dieser Klasse eine GUI starten. Ihr seht, dass zuerst nach einer Datei .settings.cfg gesucht wird

Java:
package com.sherry.calculator;

import java.io.File;

import com.sherry.calculator.gui.views.AllinFeeFrame;
import com.sherry.calculator.gui.views.SettingsFrame;


public class Main {

	/**
	 * @param args
	 */
	
	public static void main(String[] args) {
		Thread splashThread = new Thread(new SplashScreen());
		Thread settingsMain = new Thread(new SettingsFrame());
		splashThread.start();
		if (new File(System.getProperties().getProperty("user.home")+File.separator+".settings.cfg").exists()) {
			Thread allinFeeMain = new Thread(new AllinFeeFrame());
			allinFeeMain.start();
		} else {
			settingsMain.start();
			try {
				Thread allinFeeMain = new Thread(new AllinFeeFrame());
				allinFeeMain.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

	}

}
Existiert diese Datei noch nicht, soll zuerst über SettingsFrame().java die Datei angelegt werden. Und wenn dieser Thread beendet ist, soll AllinFeeFrame().java über den zweiten Thread allinFeeMain gestartet werden. Das klappt nicht so richtig. Ich hatte gelesen, dass join() gerade wartet, bis der erste Thread beendet ist.
So hat das zur Folge, dass die Datei .settings.cfg noch nicht angelegt wurde, die aber von AllinFeeFrame().java benötigt wird.
Dr StackTrace zeigt folgende Meldungen:
Code:
java.io.FileNotFoundException: /home/sherry/.settings.cfg (Datei oder Verzeichnis nicht gefunden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:146)
	at java.io.FileInputStream.<init>(FileInputStream.java:101)
	at com.sherry.calculator.Settings.readSettings(Settings.java:41)
	at com.sherry.calculator.gui.views.AllinFeeFrame.<init>(AllinFeeFrame.java:73)
	at com.sherry.calculator.Main.main(Main.java:31)
java.io.FileNotFoundException: /home/sherry/.settings.cfg (Datei oder Verzeichnis nicht gefunden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:146)
	at java.io.FileInputStream.<init>(FileInputStream.java:101)
	at com.sherry.calculator.Settings.readSettings(Settings.java:41)
	at com.sherry.calculator.gui.views.AllinFeeFrame.<init>(AllinFeeFrame.java:74)
	at com.sherry.calculator.Main.main(Main.java:31)
java.io.FileNotFoundException: /home/sherry/.settings.cfg (Datei oder Verzeichnis nicht gefunden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(FileInputStream.java:146)
	at java.io.FileInputStream.<init>(FileInputStream.java:101)
	at com.sherry.calculator.Settings.readSettings(Settings.java:41)
	at com.sherry.calculator.gui.views.AllinFeeFrame.<init>(AllinFeeFrame.java:75)
	at com.sherry.calculator.Main.main(Main.java:31)
Exception in thread "main" java.lang.NullPointerException
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1008)
	at java.lang.Double.parseDouble(Double.java:540)
	at com.sherry.calculator.gui.views.AllinFeeFrame.<init>(AllinFeeFrame.java:75)
	at com.sherry.calculator.Main.main(Main.java:31)

Wie kann ich das lösen, so dass AllinFeeFrame erst startet, wenn die Daeti angelegt wurde?

Grüße

Sherry
 
Offensichtlich willst du das ja nicht gleichzeitig machen, du kannst also auf den Thread einfach verzichten, und hat dann das Reihenfolge Problem nicht.

Oder du startest den 2. Thread einfach am ende des ersten.

Gala du es unbedingt so lösen magst, schau dir mal observer oder visitor pattern an.
 
Versuch mal das hier
Java:
public static void main(String[] args) {
    Thread splashThread = new Thread(new SplashScreen());
    Thread settingsMain = new Thread(new SettingsFrame());
    splashThread.start();
    if(!new File(System.getProperties().getProperty("user.home")+File.separator+".settings.cfg").exists()) {
        settingsMain.start();
        try {
            settingsMain.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    Thread allinFeeMain = new Thread(new AllinFeeFrame());
    allinFeeMain.start();
}
 
Erstmal besten Dank für die beiden Antworten.
Allerdings @Phash verstehe ich den Zusammenhang zu dem Observer noch nicht. Wenn ich das richtig interpretiere liefe das auf einen Listener hinaus.

@DrZoidberg:
Dein Vorschlag bringt leider wieder nur dieselben StackTraces, die Datei wurde nicht gefunden.

Mein Vorhaben ist ja, dem Anwender bei einem Erststart zur Eingabe seiner Benutzereinstellungen in die besagte Datei aufzufordern. Die Datei kann ja auch erst geben, das Programm mindestens einmal gelaufen ist.
Mein erster Ansatz war, in der if-else-Anweisung bei Nichtvorhandensein
Java:
SettingsFrame settings = new SettingsFrame();
AllinFeeFrame main = new AllinFeeFrame();
if (!new File(System.getProperties().getProperty("user.home")+File.separator+".settings.cfg").exists()) {
   settings.main(null);
   main.main(null);
} else {
   main.main(null)
}
ablaufen zu lassen. Aber sobald die Gui settings mit OK wieder geschlossen war, gab es zwar die Datei aber main.main(null) machte nichts.
Das AllinFeeFrame mit OK aus der Settings-Gui wollte ich auch nicht starten lassen, weil wenn dieses während des Laufens aus AllinFeeFrame heraus gestartet und beendet wird, würde dann auch wieder AllinFeeFrame gestartet werden.

Also irgendwie müsste es doch eine Lösung geben, da soviele Programme beim Erststart die Einstellungen wünschen und dann nie wieder.
 
Verstehe Dein Problem nicht wirklich Du must doch nur testen ob es die Datei nicht gibt und wenn dann must du vor dem main() diese Datei erst erstellen. Also schmeantisch:

Java:
if(!exists(datei))
{
     erstelleSettingsUI()
     erstelleDatei()
}
erstelleMainUI()

Gruß

Claus
 
Zuletzt bearbeitet:
Na ja, Deine Lösung hatte ich schon ausprobiert. Das ist ja auch logisch. Aber irgendwo muss ich ja das Objekt für das Hauptprogramm anlegen. Momentan habe ich folgendes Konstrukt:

Java:
public class Main {
	
	public static void main(String[] args) {
		Thread splashThread = new Thread(new SplashScreen());
		splashThread.start();
		SettingsFrame settings = new SettingsFrame();
		
		if (!new File(System.getProperties().getProperty("user.home")+File.separator+".settings.cfg").exists()) {
			settings.main(null);
			
		} else {
			AllinFeeFrame allinFee = new AllinFeeFrame();
			allinFee.main(null);
		}
		AllinFeeFrame allinFee = new AllinFeeFrame();
		allinFee.main(null);
	}

}
Was auch nicht klappt. Ich sehe einen Zusammenhang darin, dass AllinFeeFrame.java auf die .settings.cfg zugreift und bei der Initialisierung des Objektes aber die Datei noch nicht existiert.
Hier stehen Parameter drin, ohne die AllinFeeFrame.java nicht läuft. die aber so inividuell sind, dass ich sie nicht vorgeben kann.
 
Okay, sag's mir. Ich denke, ich habe klar und deutlich ausgedrückt, was ich möchte. Deine Bemerkung greift mich jetzt wirklich an😡
Denn damit unterstellst deinem Gegenüber irgendwo Dummheit. Les doch einfach, was ich geschrieben habe. Mit ein wenig Nachdenken, wirst Du schon verstehen, was ich meine.
Ich glaube Du hast eher ein grundlagen Problem. Was ist denn bitteschön ein "Hauptprogramm"?

Gruß

Claus
 
Und ich habe klar und deutlich gesagt wie es geht. Wenn Du das so nicht hinbekommst besteht kein Grund irgendwelche total abstrussen und sinnlosen Thread Wurschteleien zu basteln. Das habe ja bereits auch andere schon gesagt.

Also auch wenn es Dich angreift. Lerne programmieren.

Ich bin hier raus. Viel Glück noch beim rumprobieren...

Claus
 
Mit anderen Worten, Du bist wieder so ein abgehobener neunmalkluger Oberguru, der alles von Anfang an gekonnt hat.

Und ich habe klar und deutlich gesagt wie es geht. Wenn Du das so nicht hinbekommst besteht kein Grund irgendwelche total abstrussen und sinnlosen Thread Wurschteleien zu basteln. Das habe ja bereits auch andere schon gesagt.

Also auch wenn es Dich angreift. Lerne programmieren.

Ich bin hier raus. Viel Glück noch beim rumprobieren...

Claus
 
Die Frage die sich stellt ist doch: Brauchst du die Threads umbedingt?

Weil wenn man etwas nicht benötigt und es trotzdem einbauen möchte, macht man Dinge unnötig kompliziert. Gerade in er Programmierung passiert das eh oft genug von alleine, weswegen man bestrebt ist, die Dinge möglichst einfach zu halten.

Daher: Wenn du die Threads nicht benötigst, dann lass sie weg und dein Problem hat sich von selbst erledigt. 😉
 
Das habe ich ja bereits selber erkannt:
Die Frage die sich stellt ist doch: Brauchst du die Threads umbedingt?

Weil wenn man etwas nicht benötigt und es trotzdem einbauen möchte, macht man Dinge unnötig kompliziert. Gerade in er Programmierung passiert das eh oft genug von alleine, weswegen man bestrebt ist, die Dinge möglichst einfach zu halten.

Daher: Wenn du die Threads nicht benötigst, dann lass sie weg und dein Problem hat sich von selbst erledigt.
Ich habe es ja auch insoweit kommuniziert, dass der Compiler Fehler auswirft, wenn main.java als Erstes gestartet wird. Hier habe ich nach dem Splashscreen und dem Aufruf der SettingsFrame.java - mit der ja die Konfigurationsdatei aufgerufen wird - noch den Start des eigentlichen Programms AllInFeeFrame.java enthalten. Letzteres greift selbstverständlich auf die Konfigurationsdatei zu.
Wenn jetzt das Ganze bei Aufruf compiliert wird, merkt der Compiler, dass etwas noch nicht existiert und bringt die Fehlermeldungen. Ergo werde ich die Konfigurationsdatei mit dem Wissen nicht zu Beginn anlegen lassen können, ohne sie festeinzuprogrammieren. Selbst das klappt nicht, weil sie auch erst nach dem Compile-Vorgang existieren würde.

Und der andere Punkt hier
Java:
    if(!exists(datei))
    {
         erstelleSettingsUI()
         erstelleDatei()
    }
    erstelleMainUI()
klappt so auch nicht. Einmal aus den eben genannten Gründen. Und dann startet auch "erstelleMainUI()" nicht.
Also von den Threads bin ich schon lange abgekommen.
 
Hi,

wie wäre es, wenn du uns kurz erklärst, was genau du vorhast.
Bei dem, was du gezeigt hast, kann ich nicht die Notwendigkeit von Threads erkennen.

Wenn du das Einlesen und Schreiben der Konfig jeweils in eine Methode packst und das erstellen der GUI ist es nur eine Frage der Reihenfolge, in der du die jeweiligen Methoden aufrufst.

Ist die Reihenfolge korrekt, so sollte die Konfig erstellt und eingelesen werden und erst dann die GUI gebastelt werden.

Wenn du die Threads benötigst, kannst du einen Thread schreiben der in einer Schleife mit x Sekunden Wartezeit dazwischen überprüft ob die Datei mittlerweile existiert und wenn ja, dann den Thread zum erstellen der GUI aufruft.

Aber wie gesagt - ich sehe bisher keinen Grund für Threads.

Wie erstellst du deine Konfigdatei?

Gruß
 

Zurück
Oben