我有以下类(class):
public class MovementThread extends Thread {
private float[] myObject;
@Override
public void run() {
}
public void setMyObject(float[] array) {
myObject = array;
}
}
问题是 MovementThread 应该一直运行,所以我想在 Run 方法
中放一个 while(true)
.但是,myObject
将从另一个 Thread
更新,因此如果 Thread
卡在 Run 方法< 中,则不会发生这种情况
。另外,run 方法中的代码不应在执行 myObject
时执行。
他们这样做有什么简单的方法吗?
我只是想知道在这种情况下的最佳实践,我认为这一定经常发生。
最佳答案
首先,现在的标准做法是实现可运行而不是扩展线程(参见 "implements Runnable" vs. "extends Thread")。
while(true)
是将什么放入 run 方法的正确想法。最终您会切换到 while(someBooleanVariable)
以提供一种终止 MovementThread 的方法。
目前确保MovementThread运行的线程不与其他线程的其他成员调用冲突的方法是使用synchronized。对于简单的使用,通常可以在函数声明前加上 synchronized 前缀,所有这样的函数都不会交织在一起。
您的样本进行了所有这些修改:
请注意,myObject 的所有读取和写入都在标记为同步的函数中。
public class MovementThread extends Runnable{
private float[] myObject;
volatile boolean stillAlive = true;
@Override
public void run() {
while (stillAlive)
{
processMyObject();
Thread.sleep(1000);
}
}
private synchronized void processMyObject()
{
// Modify or read myObject
}
public void kill()
{
stillAlive = false;
}
public synchronized void setMyObject(float[] array) {
myObject = array;
}
}
关于java - 具有变化对象的连续线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12153016/