簡體   English   中英

強制方法完成后再繼續

[英]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()方法在其他任何東西之前被完全調用。

這是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方法

我可能會誤會某些內容,但是請嘗試以下操作:

public static void createThread(Runnable behaviour, String name) {
    Thread t = new Thread(behaviour, name + behaviour.hashCode()).start();
    t.join();
}

通過調用join(),程序應等待線程完成。

好吧,我現在記得,無論如何我都無法針對兩個單獨的線程使用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.
}

當第二個線程中的線程鎖到達並被釋放時,第一個線程將繼續執行其活動。 就這么簡單!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM