尽管runLater有两个AWT线程?

时间:2014-01-24 12:03:08

标签: java multithreading swing

当我在Raspberry Pi上运行我的程序时,我从日志中得到了这个:

[THREAD ID=AWT-EventQueue-2]24 Jan 2014 12:56:21 DEBUG PFrameClient - 2 - performAnimation
 [THREAD ID=AWT-EventQueue-1]24 Jan 2014 12:56:24 DEBUG PFrameClient - 3 - entering onAnimationFinished
 [THREAD ID=AWT-EventQueue-2]24 Jan 2014 12:56:24 DEBUG PFrameClient - 1 - entering performAnimation
 [THREAD ID=AWT-EventQueue-1]24 Jan 2014 12:56:24 DEBUG PFrameClient - 4 - leaving onAnimationFinished

...但是所有执行日志记录的代码都包含在SwingUtilities.invokeLater调用中(见下文)。

在Mac和Windows上,所有调用都记录在一个线程中。

有人能告诉我,并帮我弄清楚出了什么问题?

(onAnimationFinished中的计时器用于避免死锁情况)

public void performAnimation(final Animation animation) throws RemoteException {
    final Animation.Observer obs = this;
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            logger.debug("1 - entering performAnimation");
            animation.perform(world, obs);
            logger.debug("2 - performAnimation");
        }
    });
}

public void onAnimationFinished(final int tag) {
    final Timer t = new Timer();
    final TimerTask r = new TimerTask() {

        @Override
        public void run() {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {

                    logger.debug("3 - entering onAnimationFinished");


                    templateMethodOnAnimationFinished(tag);
                    try {
                        master.animationIsFinished(tag);
                    } catch (RemoteException e) {
                        throw new RuntimeException(e);
                    }
                    logger.debug("4 - leaving onAnimationFinished");
                    logger.debug("----");
                }
            });

        }

    };
    t.schedule(r, 100);
}

1 个答案:

答案 0 :(得分:0)

Aaaaaa这是因为原始的Swing框架没有使用invokeLater在Swing主线程上创建。

TIL总是在为Swing编码时检查我的程序的主要方法。