当我在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);
}
答案 0 :(得分:0)
Aaaaaa这是因为原始的Swing框架没有使用invokeLater在Swing主线程上创建。
TIL总是在为Swing编码时检查我的程序的主要方法。