gpt4 book ai didi

java - Android:线程没有更新值

转载 作者:行者123 更新时间:2023-12-02 13:02:07 25 4
gpt4 key购买 nike

我在主 Activity 中创建了两个线程来操作共享字段成员,但值似乎没有被线程更新,因为变量的值是相同的,实际上我正在练习同步,这是我的代码:

public class ActMain extends Activity {

Handler handler;
Integer THREAD_COUNTER = 10;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_act_main);

Message m = new Message();
Bundle b = new Bundle();
b.putInt("what", 5);
m.setData(b);


Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i =0; i < 10; i++){
add();
}

}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i = 0; i < 30; i++){
subtract();
}

}
});

t1.start();
t2.start();

Log.i("MainActivity " , " thread counter" + THREAD_COUNTER);
//same value 10 of THREAD_COUNTER

最佳答案

I created two threads in main activity to manipulate shared field member but value seems not updated by threads...

您的代码存在一些问题。首先,启动 2 个线程,然后立即记录结果。当 Log.i(...) 行执行时,线程实际上可能还没有开始运行。要等待后台线程完成,您需要使用join():

t1.start();
t2.start();
// t1 and t2 start running in the background but we need to wait for them to finish
t1.join();
t2.join();
Log.i(...);

另一个问题是,您不能只对 2 个线程的 THREAD_COUNTER 整数进行加法和减法。线程通过处理本地缓存内存来获得性能,因此只要线程共享信息,您就需要担心锁定和内存同步,以便它们可以协调更新。

对于多线程环境中的整数,Java 为我们提供了 AtomicInteger class这是线程并发更新整数值的好方法。所以你的代码应该是这样的:

// initialize our shared counter to 10
final AtomicInteger threadCounter = new AtomicInteger(10);
// ...
// to add:
threadCounter.addAndGet(5);
// to subtract:
threadCounter.addAndGet(-7);
// ...
// to get the value after the joins
threadCounter.get();

其他一些评论:

  • 所有大写字段均为常量。 threadCounter 而不是 THREAD_COUNTER
  • 始终使用 int 而不是 Integer,除非该值可以为 null
  • 不确定您是否这样做了,但是never call synchronized on a value that can change like an Integer or Boolean 。您必须在常量对象实例上进行同步,向 Integer 添加某些内容会更改对象,以便多个线程将锁定不同的对象。始终在 private final 字段上调用 ​​synchronized 是一个很好的模式。

关于java - Android:线程没有更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com