Wie kann man einen Thread in einer anderen Klasse aufrufen?
Das Beispiel demonstriert die gleichzeitige Ausgabe einer
Zahlenfolge und deren Fortschrittsanzeige durch einen ProgressMonitor
.
Zunächst wird eine Klasse erstellt, die in diesem Falle
lediglich einen Button zum Aufruf der Threadklasse in einem JFrame
bereitstellt. Sie wird in der main()
-Methode
aufgerufen.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class ThreadInAndererKlasse implements ActionListener {
private JButton button;
public ThreadInAndererKlasse() {
init();
}
private void init() {
JFrame frame = new JFrame();
button = new JButton("auf geht's");
button.setFocusable(true);
button.addActionListener(this);
frame.add(button);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ThreadInAndererKlasse());
}
public void actionPerformed(ActionEvent arg0) {
MachWas machDoch = new MachWas();
machDoch.start();
}
}
Die zweite Klasse stellt eine Instanz eines ProgressMonitor
bereit, der den Fortschritt eines rechenintensiven Prozesses
anzeigt. Sie muss die Klasse Thread
erweitern.
Die Mehode machDochWas()
stellt den Kern des Programmes
dar. In ihr wird innerhalb einer while
-Schleife eine
Zählvariable von 0 bis 100 hochgezählt. Bei jedem
Durchgang geschieht dreierlei:
- dem ProgressMonitor wird der Wert der Zählvariablen als String gecastet zur numerischen Darstellung übergeben.
-
die statische Methode
invokeLater()
der KlasseSwingUtilities
erhält als Parameter eine Instanz der KlasseRunnable
, deren Methoderun()
überschrieben wird, indem in dieser der neue Wert des ProgressMonitors mit Hilfe dessen MethodesetProgress()
gesetzt wird. Dies bewirkt den Fortschritt des Laufbalkens. -
durch die statische Methode
Thread.sleep()
wird anschließend der Schleifendurchlauf für 100 Millisekunden unterbrochen, um den rechenintensiven Prozess zu simulieren.
import javax.swing.ProgressMonitor;
import javax.swing.SwingUtilities;
public class MachWas extends Thread {
private ProgressMonitor pm;
int i = 0;
public MachWas(){
pm = new ProgressMonitor(null, "Fortschritt anzeigen", "", 0, 100);
pm.setMillisToDecideToPopup(1);
}
public void run(){
try {
machDochWas();
} catch (Exception e) {
}
}
public void machDochWas(){
while (!pm.isCanceled() && i<=100) {
pm.setNote(new Integer(i).toString());
SwingUtilities.invokeLater(new Runnable() {
public void run() {
pm.setProgress(i);
}
});
System.out.println(i);
// statt rechenintensiver Aktion
// Thread kurz unterbrechen
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}
}
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.