"Unfaire" Arbeits-Zeitverteilung bei Threads

Status
Nicht offen für weitere Antworten.

skummy

Aktives Mitglied
Hallo Forum,

folgendes Code-Schnippsel erzeugt bei Klick auf einen Button jeweils ein Label, eine Progressbar und ein Button. Pro Klick wird ein eigener SwingWorker-Prozess gestartet (und macht im Moment noch wenig sinnvolles). So weit so gut.

Klickt man nun kurz hintereinander paar mal auf den Button zum Starten kann man eine unterschiedliche Fortschrittsanzeige der Progressbars erkennen.

Womit ist diese zum Teil doch arg große Abweichung zu erklären?


Code:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      



    if (!checkEntry()) {
        JOptionPane.showMessageDialog(this, "   Unvollständige Angaben!", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    } else if (!checkEntryLength()) {
        JOptionPane.showMessageDialog(this, "   Zu lange Eingabe!", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    } else if (!checkThreadMaximum()) {
        JOptionPane.showMessageDialog(this, "   Maximale Anzahl an Threads erreicht", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    }
    
    else {
        SwingWorker worker = new SwingWorker() {

            @Override
            protected Object doInBackground() throws Exception {
                int i = 0;
                String text = jTextField1.getText();
                JProgressBar jProgressBar1 = new JProgressBar();
                jProgressBar1 = createProgressBar(new JProgressBar());
                createLabel(new JLabel(), text);
                createStopButton(new JButton());

                while (i < 100000) {
                    System.out.println(text);
                    i++;
                    jProgressBar1.setValue(i);
                }
                return null;
            }
        };
        worker.execute();
        setPosY(getPosY() + 40);
        setThreadCount(getThreadCount() + 1);
    }
}

Zum Testen gibts das komplette Programm hier:
http://www.skummy.de/java/Frame1.jar



Bye
Sandro
 

Lim_Dul

Top Contributor
Das Betriebssystem oder die VM ist nunmal nicht gerecht :)

Und du führst keinen Aktionen durch, womit du der VM signalisiert, dass du bereit bist, Zeit freizugeben.

Bau mal ein Thread.yield() in die Schleife ein und schau was passiert.
 

skummy

Aktives Mitglied
Nö, hab gedacht der Scheduler von VM bzw. Betriebssystem arbeitet dahingehend gerecht. Mit nem Thread.yield() wirds schon bissi fairer.

Ich werd das Programm mal unter Linux ausführen und schauen was da passiert =)!
 

HoaX

Top Contributor
noch als anmerkung: du erstellst in einem nicht-awt-thread gui-elemente und zeigst sie an, das ist böse.
 

skummy

Aktives Mitglied
Sooo...ich habs jetzt mal so umgebaut:

Code:
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      



    if (!checkEntry()) {
        JOptionPane.showMessageDialog(this, "   Unvollständige Angaben!", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    } else if (!checkEntryLength()) {
        JOptionPane.showMessageDialog(this, "   Zu lange Eingabe!", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    } else if (!checkThreadMaximum()) {
        JOptionPane.showMessageDialog(this, "   Maximale Anzahl an Threads erreicht", "Fehler", JOptionPane.OK_CANCEL_OPTION);
    } else {
        String text = jTextField1.getText();
        JProgressBar jProgressBar1 = new JProgressBar();
        jProgressBar1 = createProgressBar(new JProgressBar());
        createLabel(new JLabel(), text);
        createStopButton(new JButton());
        SwingWorkerImpl worker = new SwingWorkerImpl(jProgressBar1, text);
        worker.execute();
        setPosY(getPosY() + 40);
        setThreadCount(getThreadCount() + 1);
    }
}

Dazu hier nochmal die SwingWorkerImpl:

Code:
public class SwingWorkerImpl extends SwingWorker {

    private JProgressBar jProgressBar1;
    private String text;     
    
    public SwingWorkerImpl(JProgressBar jProgressBar1, String text) {
        this.jProgressBar1 = jProgressBar1;
        this.text = text;
    }
    
    
    @Override
    protected Object doInBackground() throws Exception {
        int i = 0;
        while (i < 100000) {

            System.out.println(text);
            i++;
            jProgressBar1.setValue(i);
        }
        return null;
    }  
    
}


So besser?


Gruß
Sandro
 
Status
Nicht offen für weitere Antworten.

Oben