问题由来:主线程中的数据,子线程对其修改后在主线程中还能获得修改后的数据吗?
栗子:
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内存区域的线程公有私有
通过些理论来诠释下。
线程这一块还需努力。。。。。。溜溜球!