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

    xiaoxiao2022-07-03  142

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

    栗子:

    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)