Wie kann man einen Thread in einer anderen Klasse aufrufen?
Nebenläufige Programmierung in Form eines weiteren Threads kann zur Bearbeitung rechenintensiver Prozesse - etwa zum Laden grosser Bilder - verwandt werden. Der Vorteil liegt darin, dass während der Bearbeitungszeit das Programm nicht 'einfriert'.
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;

public class ThreadInAndererKlasse extends JFrame implements ActionListener {
    
    private final JButton button;
    
    public ThreadInAndererKlasse(){
        
        button = new JButton("auf geht's");
        button.addActionListener(this);
        
        this.add(button);
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
public static void main(String[] args){
    new ThreadInAndererKlasse();
}

public void actionPerformed(ActionEvent arg0) {
    MachWas machDoch = new MachWas();
    machDoch.start();
}
}
Die zweite Klasse stellt eine Instanz eines JProgressMonitor 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 Klasse SwingUtilities erhält als Parameter eine Instanz der Klasse Runnable, deren Methode run() überschrieben wird, indem in dieser der neue Wert des ProgressMonitors mit Hilfe dessen Methode setProgress() 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++;
        }
    }

}
letzte Änderung an:
switch-case-Verzweigung