当前位置: 首页 > 知识库问答 >
问题:

Android并发:UI线程编辑一个变量,其他线程读取相同的变量

鲁龙野
2023-03-14

我有一个疑问是UI线程和其他线程之间相对并发

Ui主线程更新不同变量的值:-float-long-boolean

我有另一个线程读取相同的变量并对其进行一些逻辑操作(不编辑其值),并将此操作的结果发送本地广播消息

是否存在并发问题,我必须使用:同步方法和原子变量,还是无关紧要?

我反思这个问题,因为没有浮点基元的原子变量,也因为我害怕用错误的代码阻止Ui线程...

编辑:其他问题

对于引用变量和大多数原始变量(除long和double之外的所有类型),读取和写入是原子的。

来自:https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

那么int,double原语类型是原子的,对吗?问题出在长双倍身上。

例如:

class test
{

    int c=0;
    long p=0;

    new Thread1( new Runnable(){

     public void run(){
       a=a+c;
       p=p+c;
     }
    }
    ).start();

   new Thread2( new Runnable(){

     public void run(){
       c=function();
       p=functionx();
     }
    }
    ).start();

    ....
}

我必须使用volatile int来解决线程之间的可见性问题,否则就无关紧要了?对于long变量,我应该使用atomicLong,因为long原语上的操作不是原子的吗?

p、 s:我不太理解线程之间的可变可见性问题

共有1个答案

葛智敏
2023-03-14

看看我给出的另一个答案,你可能需要的是让变量变得易变。UI线程,不是UI线程,线程就是线程。在UI线程上修改变量的重要性在于这样才能显示变量。您所做的是将修改后的值发送到其他地方。

从我对你问题的理解来看:只要让变量不稳定,你就会没事。

 类似资料:
  • 我有一个疑问相对于UI线程和其他线程之间的concurrency。 Ui主线程更新不同变量的值:-flol-long-boolean 我还有另一个线程,它读取同一个变量,并用它执行一些逻辑操作(不编辑它的值),然后用这个操作的结果发送本地广播消息。 是否存在并发问题???我必须使用同步方法和原子变量,否则就无关紧要了? 我反思这个问题,因为没有浮点基元的原子变量,也因为我害怕用错误的代码阻止Ui线

  • 在我的程序中,我需要多个线程使用和编辑同一个变量,但它似乎不起作用。这是我的意思的一个例子,这将是我的主要课程。 这将是我的Thread类: 我当场编写了这段代码,所以可能会有一些错误,但没关系。我的程序基本上需要这样做,但不是每次打印数字加1,而是所有线程只需多次打印相同的数字0。请帮帮我,谢谢。

  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 问题内容: 我正在用Go编写执行大量并行计算的软件。我想从工作线程中收集数据,但我不太确定如何以安全的方式进行数据收集。我知道我可以使用通道,但是在我的场景中,它们使它变得更加复杂,因为我必须以某种方式同步主线程中的消息(等到每个线程发送了一些东西)。 情境 主线程创建 n个 实例,并在goroutine中启动其方法,以便每个工作线程都在各自的线程中运行。主线程每10秒应从工作线程中收集一些简单值

  • 你好,我是多线程编程的新手。我正在尝试创建一个代码来创建一个线程THREAD1,在它完成某些事情后,它会触发另外两个线程,例如THREAD2和THREAD3,然后退出。 我写了两个可能的解决方案。 1) 使用条件变量(不起作用:在某些情况下会出现死锁): 2) THREAD1直接创建另外两个线程。 我想知道你的意见。非常感谢你