我在用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渲染器在一个线程中运行,而我的游戏逻辑线程将在另一个线程中运行,并且我希望将它们同步到每一帧或两帧),
是让它变成只是众多解决方案之一,但也许你可以解释为什么这实际上起作用,为什么thread.sleep()似乎也对结果有一些影响。 –
我可以解释易失性部分。 'volatile'在两个线程之间建立一个“与...同步”的关系。如果线程T1看到线程T2在某个易失性变量上写入的值,那么可以保证T1将看到T2所做的所有以前的写入,包括那些写入非易失性变量的写入。我已经看到一些人说,如果T2在T1尝试读取之前写入一个易失性变量,T1将总是读取T2写入的值,但我认为这不是真的(我想对此做一些澄清: - )。关于'睡眠'的影响,击败我! –