Java Android:线程没有更新值
我在主活动中创建了两个线程来操作共享字段成员,但该值似乎没有被线程更新,因为变量的值是相同的,实际上我正在练习同步,下面是我的代码:Java Android:线程没有更新值,java,android,multithreading,synchronization,thread-safety,Java,Android,Multithreading,Synchronization,Thread Safety,我在主活动中创建了两个线程来操作共享字段成员,但该值似乎没有被线程更新,因为变量的值是相同的,实际上我正在练习同步,下面是我的代码: public class ActMain extends Activity { Handler handler; Integer THREAD_COUNTER = 10; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstance
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
公共类ActMain扩展活动{
处理者;
整数线程_计数器=10;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u act\u main);
消息m=新消息();
Bundle b=新Bundle();
b、 putInt(“what”,5);
m、 setData(b);
线程t1=新线程(新的可运行线程(){
@凌驾
公开募捐{
对于(int i=0;i<10;i++){
添加();
}
}
});
线程t2=新线程(新可运行(){
@凌驾
公开募捐{
对于(int i=0;i<30;i++){
减法();
}
}
});
t1.start();
t2.start();
Log.i(“MainActivity”、“线程计数器”+线程计数器);
//线程计数器的相同值10
基本上当你做这三行的时候
t1.start();
t2.start();
Log.i("MainActivity " , " thread counter" + THREAD_COUNTER);
它们都是同时发生的,所以当日志发生时线程计数器不会更新。如果发生这种情况,可以使用asynctask并在线程末尾打印,或者
log.i在线程本身中
当您这样打印时,您只需在线程更新var之前打印即可
有关java中多线程的更多信息(用于学习):
有关asynctask(具有生命周期的android线程,因此您可以在完成任务后在UI中执行操作)的更多信息:
我在主活动中创建了两个线程来操作共享字段成员,但该值似乎没有被线程更新
您的代码有几个问题。首先,启动两个线程,然后立即记录结果。在执行log.i(…)
行时,这些线程可能尚未开始运行。要等待后台线程完成,您需要使用join()
:
另一个问题是,您不能只对两个线程的THREAD\u计数器
integer进行加减运算。线程的性能是通过使用本地缓存获得的,因此每当线程共享信息时,您都需要担心锁定和内存同步,以便它们可以协调更新
对于多线程环境中的整数,Java为我们提供了一种新的方法,这是线程并发更新整数值的一种很好的方法
// 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();
其他几点意见:
- 所有caps字段都是常量。
而不是threadCounter
THREAD\u COUNTER
- 始终使用
而不是int
,除非该值可以是Integer
null
- 不确定是否执行了此操作,但是。必须在常量对象实例上进行同步,向
添加内容会更改对象,以便多个线程将锁定不同的对象。始终在Integer
字段上调用private final
是一种很好的模式synchronized
t1.join()
first。对线程操作的控制越多,它就越不像线程程序。你不必担心哪个线程先运行,哪个线程先完成。@blackHawk
// 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();