代码之家  ›  专栏  ›  技术社区  ›  user5549921

继续之前强制方法完成

  •  0
  • user5549921  · 技术社区  · 7 年前

    public static void main(String[] args) {
        GLDisplay display = new GLDisplay();
        display.start();
    
        GLShader shader = new StaticShader();
    }
    

    我的GL创建开始于 display.start() 一个单独的 线程被创建,在单独的线程中,我的显示被创建。

    除了这是问题所在,我在另一个线程中有它。然后我的程序继续运行,开始过早地执行 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();
    }
    

    synchronized 在start方法中,这只是我的一次尝试,但没有成功。我还尝试了以下方法(实际上是从另一个StackOverflow答案中获取的):

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

    GlDisplay 隐藏它。
    有什么想法吗?

    编辑:

    GLDisplay 关闭其中一个(使用 Thread.join() )因为存在一个while循环,用于更新整个程序的显示。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Michael Markidis    7 年前

    您可以使用 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();
    }
    

    countDown 倒计时锁存法

        2
  •  0
  •   Eduardo    7 年前

    我可能误解了什么,但请尝试以下方法:

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

        3
  •  0
  •   user5549921 user5549921    7 年前

    实际上,我不需要使用任何线程锁类或任何东西,而是可以做一些像这样简单的事情:

    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.
    }
    

    当第二个线程中达到线程锁并释放时,第一个线程继续执行其活动。就这么简单!