[英]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.