java - 具有变化对象的连续线程

标签 java android multithreading asynchronous

我有以下类(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/

相关文章:

java - Android 注释不是用 Ant 编译的

c - 解锁时向多个线程发出信号的一把锁

ios - Swift:如何确保 seque 在 http 任务完成之前不运行?

java - Scala 从扩展 java 类的基类调用 super

java - Redshift 和 Postgres JDBC 驱动程序都拦截 jdbc ://postgresql connection string

java - 部署 Java WAR 文件时出错 : SEVERE: Exception fixing docBase for context

multithreading - Spring相当于CompletionService?

java - "Empty"Java Pattern 类中的间隔量词

android - 如何将相机动画设置为 Google Maps v2 for Android 中的指定位置?

android - 如何从 Android SDK 使用测试用户登录 facebook