在继续之前强制方法完成

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。就这么简单!