gpt4 book ai didi

java - 在继续之前强制方法完成

转载 作者:行者123 更新时间:2023-12-02 12:38:55 29 4
gpt4 key购买 nike

我正在处理一些敏感的 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 关键字,这只是我的一次尝试,但没有成功。我还尝试了以下方法(实际上是从另一个 StackOverflow 答案中获取的):

@Override
public void run() {
synchronized(this) {
// GL code
}
}

我已经检查了其他 StackOverflow 答案,但要么不理解它们,要么对我的情况没有帮助。对于我在 main 方法中给出的第一个代码块,这就是我希望我的代码对使用它的人来说的样子。我试图将线程创建放入 GlDisplay 中以隐藏它。
有什么想法吗?

编辑:

我不能简单地等待 GLDisplay 关闭(使用 Thread.join()),因为有一个 while 循环可以更新整个显示程序的。
这就是我使用多线程的全部原因。当我在程序中执行其他操作时,允许这个永远结束的循环运行。通过关闭线程,我关闭了循环,清理显示并从内存中释放 GL 上下文,再次使着色器代码因缺少现有上下文而失败。

最佳答案

您可以使用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 方法

关于java - 在继续之前强制方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45024718/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com