Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:线程没有更新值_Java_Android_Multithreading_Synchronization_Thread Safety - Fatal编程技术网

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
    是一种很好的模式

这意味着我们可以指示其他线程等待第一个线程完成join,然后开始执行,而且我们还强制日志仅显示第二个线程完成t2.join()的时间;我们暂停主线程了吗?首先我做了t1.join,然后是log1,然后是t2.join,然后是log2,有时我得到了正确的执行t1->log1->t2->log2,有时是t1->t2->log1->log2,为什么会发生这种情况,有时是t2->t1->log1->log2,因为线程是同步的。即使运行
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();