使用线程

时间:2016-03-22 03:51:05

标签: java multithreading thread-sleep

我知道设置一个在线程停止运行之前一直运行的while循环并不是一个好习惯,但我已经用完了其他想法。然而,即使我诉诸于此(或类似的东西),我仍然无法让我的程序正常运行。

这是我的代码:

public void phase1() {
    phase1CompoundLabels = new JLabel[numberOfElements];
    okToShowAlternatives = false;

    remove(btnNewButton);
    revalidate();
    repaint();

    while (totalNoOfPhase1Trials > 399) {
        Phase1Trial phase1Trial = new Phase1Trial(numberOfElements, elementColors);

        // this displays a set of images
        displayComplexStimulus(phase1Trial.getComplexStimulus());

        validate();

        // after calling this method the images get removed after two
        // seconds and the okToShowAlternatives variable gets its value
        // changed to true
        removeElementsAfterInterval(2000, phase1CompoundLabels);

        // while(okToShowAlternatives == false){
        // }

        // calling this method displays two images
        // displayAlternatives(phase1Trial.getcorrectImage(),
        // phase1Trial.getincorrectImage(),
        // phase1Trial.getcorrectElementIsOnLeft());


private void removeElementsAfterInterval(int milliseconds, JLabel[] labels) {
    Thread compoundThread = new Thread(new Runnable() {

        public void run() {
            try {
                Thread.currentThread().sleep(milliseconds);
                for (int i = 0; i < labels.length; i++) {
                    remove(labels[i]);
                    revalidate();
                    repaint();

                }
                okToShowAlternatives = true;
                System.out.println("OkToShowAlternatives: " + okToShowAlternatives);

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                Thread.currentThread().interrupt();
            }

        }

    });
    compoundThread.start();
}

使用while循环(在条件中具有OkToShowAlternatives的那个)和displayAlternatives()方法调用注释掉,如图所示,直到该点的程序工作正常,因为图像集显示两秒然后从jpanel中删除。但是,当我包含while循环时,程序停止显示图像集,我甚至无法关闭jframe。它完全没有反应。

但是当我包含一个print语句来查看OkToShowElements变量的值是否变为true时,它确实如此。那么,不应该再满足while循环的条件,因此退出while循环并继续下一部分代码吗?

1 个答案:

答案 0 :(得分:0)

不允许您与其他线程中的Swing组件进行交互。由于Swing是单线程设计的,因此如果您从与UI线程不同的线程中与Swing中的组件树进行任何交互,则可以获得各种竞争条件和内存可见性问题。

使用Swing Timers在指定的延迟后执行Swing UI线程上的代码:

ActionListener executeThisAfterDelay = ...;
Timer timer = new Timer(speed, executeThisAfterDelay);
timer.setInitialDelay(pause);
timer.start();

有关进一步参考,请参阅Oracle网站上的How To Use Swing Timers Java教程。