【发布时间】:2017-03-24 02:37:40
【问题描述】:
在阅读 Java doc plus stackoverflow 的答案后没有这个问题,我想到 Thread.sleep() 休眠当前线程。好的。在我的情况下,我如何确定当前线程是什么?
当此代码第一次运行时,它会在执行 main 函数的默认线程中运行。我对吗?所以我们让这个线程休眠一秒钟,让其他线程做他们的事情。
在调用invokeLater() 之后,我们开始从全新的线程运行渲染方法,所以当我们第二次调用Thread.sleep() 时,我们会中断这个新线程,而默认线程正在运行而没有任何中断。我在这里错过了什么吗?
我不明白的最后一件事是,当我测试这段代码时,通过调用Thread.sleep() 它会中断整个 Swing 事物:GUI、事件等。这意味着在我的程序中与 Swing 无关的所有内容都应该运行绝对无缝,但似乎并非如此。
private void render() {
if (bs == null) {
createBufferStrategy(3);
bs = getBufferStrategy();
}
g = bs.getDrawGraphics();
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
onRender(g);
g.dispose();
bs.show();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
EventQueue.invokeLater(() -> render());
}
【问题讨论】:
-
Sleep 是一个
static方法,因此它总是会中断当前线程。 -
它不会打断任何东西。它使当前线程休眠。这是一种静态方法。它不能做任何其他事情。
-
@EJP 是否在我传递给 invokeLater 或 EDT 的新可运行对象中运行渲染方法?
-
Javadoc 中已回答。为什么要在这里浪费时间?
-
@EJP,当我将一个runnable 传递给invokeLater 时,我正在创建另一个线程并使用它的方法run 来调用该渲染方法。这怎么可能?我的意思是,只有一个线程是 EDT。 EDT 以某种方式使用队列,在处理完所有 Swing 内容后,它从可运行对象执行 run 方法,而不创建另一个线程。我只是想了解它在内部是如何工作的。
标签: java multithreading