2011-08-01 130 views
0

我在用java多线程,在一个例子很好地说明一些问题:的Java多线程同步问题

class Thread1 extends Thread 
    { 
     boolean val=false; 


     public void set() 
     {  
      val=true; 
     } 


     public void run() 
     { 

     while (true) 
     { 

      if(val==true) 
      { 
       System.out.println("true"); 
       val=false; 
      } 

      try 
      { 
       sleep(1); 
      } 
      catch (InterruptedException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

所以这是它在一个单独的线程运行一个简单的类。

现在考虑这种情况下: 1)我从其他线程启动线程类中的上述 2)我所说的Thread1.set()功能 3)条件的Thread1.run()函数的计算结果为真

现在,事情是,如果我从上面的代码中删除睡眠(1),这个条件永远不会设置为true。

所以我的问题是:有没有其他方式可以中断run()函数,以便 其他函数可以设置将在run()函数内部使用的变量? (我正在Android上制作游戏,因此openGL渲染器在一个线程中运行,而我的游戏逻辑线程将在另一个线程中运行,并且我希望将它们同步到每一帧或两帧),

回答

4

如果只有一个线程(即读取线程以外的线程)正在修改val,然后将其设置为volatile

+0

是让它变成只是众多解决方案之一,但也许你可以解释为什么这实际上起作用,为什么thread.sleep()似乎也对结果有一些影响。 –

+0

我可以解释易失性部分。 'volatile'在两个线程之间建立一个“与...同步”的关系。如果线程T1看到线程T2在某个易失性变量上写入的值,那么可以保证T1将看到T2所做的所有以前的写入,包括那些写入非易失性变量的写入。我已经看到一些人说,如果T2在T1尝试读取之前写入一个易失性变量,T1将总是读取T2写入的值,但我认为这不是真的(我想对此做一些澄清: - )。关于'睡眠'的影响,击败我! –

3

您的布尔变量不是volatile这意味着不能保证两个不同的线程看到相同的值。通过休眠虚拟机可能会导致从不同线程设置的值对线程可见(这只是一种猜测 - 没有其他),但不应以任何方式依赖此行为。根据您的需要,您应该使用volatile布尔变量或AtomicBoolean类。

+0

现在工作,因为它应该,谢谢! – n3XusSLO