java - AWT 事件线程中断

标签 java multithreading swing awt

我有代码:

import java.awt.Dimension;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Test2 {

JFrame frame = null;
JPanel panel = null;
JButton button = null;
Task task = null;
Indicator indicator = null;
Runnable computation;

public static void main(String[] args) {
    new Test2().start();
}

public void start() {
    SwingUtilities.invokeLater(new Dialog());
}

private void process1() {
    int result = 0;

    for (int i=0; i<100000; i++) {
        result = (int) Math.ceil(++result + Math.sqrt(result));

        System.out.println("proc1 " + result);
    }
}

private void process2() {
    int result = 0;

    for (int i=0; i<100000; i++) {
        result = (int) Math.ceil(++result + Math.sqrt(result)*500);

        System.out.println("proc2 " + result);
    }
}

private class Computation implements Runnable {

    public void run() {

        process1();
        task.setProgress(2);
        process2();
        task.setProgress(3);
    }

}

private class Dialog implements Runnable {

    public Dialog() {
    }

    public void run() {
        frame = new JFrame("Test");
        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 200));
        frame.getContentPane().add(panel);
        button = new JButton("b1");
        panel.add(button);
        indicator = new Indicator();
        task = new Task();
        task.addObserver(indicator);

        frame.pack();
        frame.setVisible(true);

        computation = new Computation();
        SwingUtilities.invokeLater(computation);
    }
}

private class Task extends Observable {

    int progress;

    public Task() {

    }

    public void setProgress(int progress) {
        this.progress = progress;
        setChanged();
        notifyObservers();
    }

    public int getProgress() {
        return progress;
    }
}

private class Indicator implements Observer {

    @Override
    public void update(Observable arg0, Object arg1) {
        button.setText(((Task)arg0).getProgress()+"");
    }
}
}

所以我有两个耗时的操作(process1 和 process2)。我的目标是在process1完成后,更新swing-button(参见task.setProgress方法)。

问题在于process1()和process2()完成后执行更新。

最佳答案

..update is performed after process1() and process2() are completed.

不要在 EDT 上执行长时间运行的任务,请参阅 Concurrency in Swing了解详情。实现这一目标的一种方法是使用 SwingWorker .


..if I use two SwingWorkers for performing process1() and process2(), then order of their execution is unpredictable. I need process2() follows by process1(). How I can obtain this?

doInBackground() 中调用这两个方法1 SwingWorker 的方法,调用 SwingWorker.setProgress(int)在适当的时间使用适当的值。例如

... doInBackground() {
    setProgress(0);
    process1();
    setProgress(50);
    process2();
    setProgress(100);
}

关于java - AWT 事件线程中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7653746/

相关文章:

java - 为什么外部同步比内部同步快?

c++ - 如何在不同的线程中保持一定的帧率

c++ - OpenMP 和 STL vector

java - jTable -Java 上的点击事件

java - 如何在java中组合两个图标?

java - 为什么我的简单应用程序没有收到 UDP 数据包

java - JTextField 数组。面板中的对齐方式

java - MacOS 雪豹和 Eclipse : Error starting Eclipse (No Java virtual machine. ...)

java - 单击按钮后搜索索引值

java - 将图像设置为 JPanel 背景的最简单方法