主线程和子线程的数据交互

问题由来:主线程中的数据,子线程对其修改后在主线程中还能获得修改后的数据吗?

栗子:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "123";
    public static int anInt = 1;

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

        // 子
        new Thread(new Runnable() {
            @Override
            public void run() {
                anInt = 2;
                Log.i(TAG, "子线程: " + anInt);
            }
        }).start();
        // 主
            Log.i(TAG, "主线程: " + anInt);
      
    }
}

如上:主线程定义了anInt,子线程对其修改。我们再在主线程打印,能得到修改后的anInt = 2 吗?
答案:不确定
原因:线程争夺cup使用权顺序不确定,可能,子线程先获得使用权,则两个Log都打印2。当然主线程先获得使用权时主线程的log打印数值为1。

解决方案

1、让子线程先执行。

比如主线程设置低优先级、主线程休息等等(不靠谱,提供一种想法吧)

2、安卓中的Handler机制

子线程发送消息,主线程接受消息,只有主线程收到消息再打印处理数值。
handler使用略。。。。。。

3、接口回调机制

结合上栗子代码如下

package com.example.administrator.layoutdemo.utils;

/**
 * Create by SunnyDay on 2019/05/22
 */
public interface MyCallBack {
    void onSuccess(String msg,int value);
}



public class MainActivity extends AppCompatActivity implements MyCallBack {
    private static final String TAG = "123";
    public static int anInt = 1;

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

        // 子
        new Thread(new Runnable() {
            @Override
            public void run() {
                anInt = 2;
                Log.i(TAG, "子线程: " + anInt);
                MainActivity.this.onSuccess("aaa",anInt);
            }
        }).start();
        // 主

          //  Log.i(TAG, "主线程: " + anInt);


    }

 // 主
    @Override
    public void onSuccess(String msg,int value) {
        if (msg!=null){
            Log.i(TAG, "主线程: " + anInt);
        }
    }

}

如上子线程触发(MainActivity.this.onSuccess(“aaa”,anInt);)主线程才回调。
原理还是等到子线程处理后主线程在处理。

4、其他思路

以上思路就是个人想到的思路,以及解释。总感觉使用其他的理论比如:
1、线程间的可见性
2、java内存区域的线程公有私有
通过些理论来诠释下。
线程这一块还需努力。。。。。。溜溜球!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值