Thread verwalten

Diskutiere Thread verwalten im AWT, Swing, JavaFX & SWT Bereich.
C

chrism120

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:
J

JustNobody

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

MoxxiManagarm

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();
};
 
Thema: 

Thread verwalten

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben