Thread verwalten

chrism120

Aktives Mitglied
Hallo allerseits ,
ich benötige eure Hilfe bitte.
Ich habe 5 Threads hergestellt und möchte wissen wie ich die vewalten kann. Zum Beispiel , wenn ich auf diesen Knopf drücke, sollt nur ein Button getroffen werden. ich habe 5 Buttons. ein Knopf ist für scan , Resultat exportieren , importieren , Database anzeigen. und wenn ich beispielweise auf den Knopf " Scan " drücken wird die Aktion durchgeführt aber ich aber bemerkt ,dass ich gleichzeitig auf den Knopf "Show database" drücke funktioniert auch. Ich will , dass nur ein gedrückter Knopf gleichzeitig funktioniert. Unter ist mein Quellcode.
Java:
  // Action for each buttonclick
                @Override
                public void actionPerformed(ActionEvent a) {

                    Object source = a.getSource();
                    if (source ==b) {
                        Runnable runnable = new Runnable() {
                            @Override
                            public void run() {

                                p1 = t.getText();
                                p2 = t1.getText();
                                // condition on Textfield t and t1
                                if (t == null && t1 == null || p1.isEmpty() || p2.isEmpty() || p1.isBlank() || p2.isBlank()) {
                                    JOptionPane.showMessageDialog(null, " please fill in the address fields 1 and 2");
                                } else {
                                    byte[] ip1 = ipv4ToBytes(p1);
                                    byte[] ip2 = ipv4ToBytes(p2);
                                    Runnable r1 = new Runnable() {
                                        @Override
                                        public void run() {
                                            byte[] a = ip1;
                                            while (true) {
                                                try {
                                                    synchronized (p2) {
                                                        if (isNotEquals(a, ip2)) {
                                                            String s = bytesToIpv4(a);
                                                            InetAddress ad = InetAddress.getByName(s);
                                                            if (ad.isReachable(timeout))
                                                                insertdb("INSERT INTO Adresse (Ip,HostName,ThreadNummer) VALUES (?,?,?)", s, ad.getHostName(), 1);

                                                            count(a);
                                                        } else {
                                                            break;

                                                        }
                                                    }

                                                } catch (IOException e) {
                                                }

                                            }

                                        }

                                    };

                                    Runnable r2 = new Runnable() {
                                        @Override
                                        public void run() {
                                            byte[] a = ip2;
                                            while (true) {

                                                try {
                                                    synchronized (p1) {
                                                        if (isNotEquals(a, ip1)) {
                                                            String s = bytesToIpv4(a);
                                                            InetAddress ad = InetAddress.getByName(s);
                                                            if (ad.isReachable(timeout))
                                                                insertdb("INSERT INTO Adresse (Ip,HostName,ThreadNummer) VALUES (?,?,?)", s, ad.getHostName(), 2);
                                                            count2(a);

                                                        } else {
                                                            break;
                                                        }

                                                    }
                                                } catch (IOException e) {
                                                }
                                            }
                                        }

                                    };
                                    new Thread(r1).start();
                                    new Thread(r2).start();
                                }
                            }
                        };
                        new Thread(runnable).start();
                    }

// press on the button 2

                    else if (source ==  b1 ) {

                        Runnable runnable1 = new Runnable() {
                            @Override
                            public void run() {
                                t3.append("The informations are:\n");
                                t3.append("*****************************************************\n");
                                show("SELECT * FROM Adresse");
                                t3.append("*****************************************************\n");
                            }
                        };
                        new Thread(runnable1).start();
                    }
                    else if (source==b3) {
                       Runnable runnable2 = new Runnable() {
                            @Override
                            public void run() {
                                Pdelete = t2.getText();
                                if (t2 == null || Pdelete.isEmpty()) {
                                    JOptionPane.showMessageDialog(null, " This case is empty, please, give a value!");
                                } else {
                                    try {
                                        delete(" DELETE  FROM Adresse WHERE Ip=? ", Pdelete);
                                        String update = "UPDATE FROM Adresse WHERE Ip=?";
                                        st = conn.prepareStatement(update);
                                        st.executeUpdate();
                                    } catch (SQLException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        };
                        new Thread(runnable2).start();
                    }
                    else if(source==bexport) {
                      Runnable runnable3 = new Runnable() {
                            @Override
                            public void run() {


                                dbexport(new File("C:\\Users\\Chris-Pc\\Desktop\\Output.csv"));
                            }
                        };
                        new Thread(runnable3).start();
                    }
                    else if (source ==bimport) {
                       final Runnable runnable4 = new Runnable() {
                            @Override
                            public void run() {
                                dbimport();
                            }
                        };
                        new Thread(runnable4).start();
                    }
                    else if (source == b4) {
                   Runnable run5 = new Runnable() {
                            @Override
                            public void run() {
                                ping();
                            }
                        };
                        new Thread(run5).start();
                    }
                    else {
                        System.exit(99);
                    }
                }

Ich danke Euch im Voraus für eure Hilfe.
Liebe Grüße.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also die möglichen Pattern bei sowas sind immer gleich:
a) Statt einfach nur lokale Variablen zu verwenden musst Du eine Instanzvariable haben, die den Status speichert.

Was Du z.B. machen könntest: Du speicherst einen Thread in einer Instanzvariable. Dann kannst Du prüfen, ob der Thread null ist oder wenn nicht, ob der Thread noch läuft. So der Thread noch läuft, machst Du eben nichts, da noch etwas läuft.

Da Du auch teilweise noch weitere Threads startest, musst Du da ggf. halt einen Thread zum Hauptthread machen und der wartet am Ende, bis die anderen gestarteten Threads beendet sind ehe er sich selbst beendet. (Thread.join() Aufrufe z.B.)

b) Du kannst den Status evtl. auch direkt in den Controls speichern. So kannst Du beim drücken des Knopfes alle Knöpfe erst einmal disablen ... Wenn dann die Verarbeitung beendet ist müssen die Threads die Knöpfe wieder enabled werden.

Generell würde ich immer etwas wie a) machen. Irgendwas einfach zu starten ohne eine Referenz darauf zu merken finde ich selten angebracht (Aber es mag durchaus Gründe für sowas geben....). Aber da wäre dann eine kleine Klasse zur Kontrolle der Threads durchaus angebracht incl. Observer Pattern damit andere Klassen benachrichtigt werden können.
b) Gehört zu einer GUI auch dazu, aber die GUI würde ich halt deutlich von der Business Logik trennen. Die GUI würde bei mir also irgendwas in der Business Logik triggern (und die Buttons deaktivieren) und die Business Logik würde die GUI dann nur benachrichtigen, wenn die Aktion abgeschlossen ist, so dass die GUI dann darauf reagieren kann.
 

MoxxiManagarm

Top Contributor
Du verwaltest dein Runnable übergeordnet und greifst auf dieses zu

Java:
// in deiner Instanz
Thread buttonProcess;

// in deiner Action Methode
if (buttonProcess == null || !buttonProcess.isAlive()) {
  Runnable r = switch (a.getSource()) { // switch expression, maybe not available in your used version
    case b -> createRunnableForB();
    case b1 -> createRunnableForB1();
    // ....
  }

  buttonProcess = new Thread(r).start();
};
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Ticker als Thread AWT, Swing, JavaFX & SWT 3
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben