在继续之前强制方法完成
Force method to finish before continuing
我正在处理一些敏感的 LWJGL 代码,需要确保在执行任何其他代码之前创建我的显示和 GL 上下文。
为了清楚地说明我目前的困境,请看以下内容:
public static void main(String[] args) {
GLDisplay display = new GLDisplay();
display.start();
GLShader shader = new StaticShader();
}
我的 GL 创建开始于 display.start()
,其中 创建了一个单独的 线程,并在单独的线程中创建了我的 Display。
除了这是问题所在,我把它放在一个单独的线程中。然后我的程序继续并开始过早地执行 new StaticShader()
调用更多的 GL 代码,破坏了程序。 (在创建显示之前无法执行)。
我想做的是同时实现两个线程,我 已经有 ,但要确保 start()
方法被调用 完全 先于其他。
启动方法的工作原理如下:
public synchronized void start() {
Threader.createThread(this, "GLDisplay");
}
@Override // public class GLDisplay extends Runnable
public void run() {
// GL code goes here.
}
这里是 Threader
:
public static void createThread(Runnable behaviour, String name) {
new Thread(behaviour, name + behaviour.hashCode()).start();
}
现在您可能会注意到 start 方法中的 synchronized
关键字,那只是我的一次尝试,但没有成功。我还尝试了以下方法(我实际上是从另一个 Whosebug 答案中获取的):
@Override
public void run() {
synchronized(this) {
// GL code
}
}
我已经检查了其他 Whosebug 答案,但要么不理解它们,要么对我的情况没有帮助。对于我在 main 方法中给出的第一个代码块,这就是我希望我的代码对使用它的人的看法。我试图将线程创建放在 GlDisplay
中以隐藏它。
有什么想法吗?
编辑:
我不能简单地等待 GLDisplay
关闭(使用 Thread.join()
),因为有一个 while 循环可以更新整个程序的显示。
这就是我对其进行多线程处理的全部原因。当我在程序中做其他事情时允许这个永远结束的循环到 运行。通过关闭线程,我关闭了循环,清理显示并从内存中释放 GL 上下文,再次使着色器代码因缺少现有上下文而失败。
我可能误解了什么,但请尝试以下操作:
public static void createThread(Runnable behaviour, String name) {
Thread t = new Thread(behaviour, name + behaviour.hashCode()).start();
t.join();
}
通过调用 join(),程序应等待线程完成。
您可以使用 java.util.concurrent.CountDownLatch 来实现它,这有助于让线程等待其他线程上的操作完成。请参阅有关使用它的内容和方法的参考。
示例:
public static void main(String[] args) {
CountDownLatch cdl = new CountDownLatch(1);
// pass the CountDownLatch into display
GLDisplay display = new GLDisplay(cdl);
display.start();
// wait for the latch to have been counted down in the disp thread
try
{
cdl.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
GLShader shader = new StaticShader();
}
在您的 GLDisplay 线程中,调用 CountDownLatch
的 countDown
方法
好吧,我现在想起来了,无论如何我都不能针对两个单独的线程编写 GL 代码,但这不是重点。
我实际上不需要使用任何线程锁 类 或任何东西,而是可以做一些像这样简单的事情:
private Boolean threadLock = true;
public void start() {
Threader.createThread(this, "GLDisplay");
while (true) {
synchronized(threadLock) {
if (!threadLock) break;
}
}
}
@Runnable
public void run() {
// Do GL code.
synchronized(threadLock) { threadLock = false; }
// Do the rest of whatever I'm doing.
}
当第二个线程达到线程锁并被释放时,第一个线程继续执行它 activity。就这么简单!
我正在处理一些敏感的 LWJGL 代码,需要确保在执行任何其他代码之前创建我的显示和 GL 上下文。
为了清楚地说明我目前的困境,请看以下内容:
public static void main(String[] args) {
GLDisplay display = new GLDisplay();
display.start();
GLShader shader = new StaticShader();
}
我的 GL 创建开始于 display.start()
,其中 创建了一个单独的 线程,并在单独的线程中创建了我的 Display。
除了这是问题所在,我把它放在一个单独的线程中。然后我的程序继续并开始过早地执行 new StaticShader()
调用更多的 GL 代码,破坏了程序。 (在创建显示之前无法执行)。
我想做的是同时实现两个线程,我 已经有 ,但要确保 start()
方法被调用 完全 先于其他。
启动方法的工作原理如下:
public synchronized void start() {
Threader.createThread(this, "GLDisplay");
}
@Override // public class GLDisplay extends Runnable
public void run() {
// GL code goes here.
}
这里是 Threader
:
public static void createThread(Runnable behaviour, String name) {
new Thread(behaviour, name + behaviour.hashCode()).start();
}
现在您可能会注意到 start 方法中的 synchronized
关键字,那只是我的一次尝试,但没有成功。我还尝试了以下方法(我实际上是从另一个 Whosebug 答案中获取的):
@Override
public void run() {
synchronized(this) {
// GL code
}
}
我已经检查了其他 Whosebug 答案,但要么不理解它们,要么对我的情况没有帮助。对于我在 main 方法中给出的第一个代码块,这就是我希望我的代码对使用它的人的看法。我试图将线程创建放在 GlDisplay
中以隐藏它。
有什么想法吗?
编辑:
我不能简单地等待 GLDisplay
关闭(使用 Thread.join()
),因为有一个 while 循环可以更新整个程序的显示。
这就是我对其进行多线程处理的全部原因。当我在程序中做其他事情时允许这个永远结束的循环到 运行。通过关闭线程,我关闭了循环,清理显示并从内存中释放 GL 上下文,再次使着色器代码因缺少现有上下文而失败。
我可能误解了什么,但请尝试以下操作:
public static void createThread(Runnable behaviour, String name) {
Thread t = new Thread(behaviour, name + behaviour.hashCode()).start();
t.join();
}
通过调用 join(),程序应等待线程完成。
您可以使用 java.util.concurrent.CountDownLatch 来实现它,这有助于让线程等待其他线程上的操作完成。请参阅有关使用它的内容和方法的参考。
示例:
public static void main(String[] args) {
CountDownLatch cdl = new CountDownLatch(1);
// pass the CountDownLatch into display
GLDisplay display = new GLDisplay(cdl);
display.start();
// wait for the latch to have been counted down in the disp thread
try
{
cdl.await();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
GLShader shader = new StaticShader();
}
在您的 GLDisplay 线程中,调用 CountDownLatch
的countDown
方法
好吧,我现在想起来了,无论如何我都不能针对两个单独的线程编写 GL 代码,但这不是重点。
我实际上不需要使用任何线程锁 类 或任何东西,而是可以做一些像这样简单的事情:
private Boolean threadLock = true;
public void start() {
Threader.createThread(this, "GLDisplay");
while (true) {
synchronized(threadLock) {
if (!threadLock) break;
}
}
}
@Runnable
public void run() {
// Do GL code.
synchronized(threadLock) { threadLock = false; }
// Do the rest of whatever I'm doing.
}
当第二个线程达到线程锁并被释放时,第一个线程继续执行它 activity。就这么简单!