1.首先声明 一个super简单的handler
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println("msg====" + msg.what);
}
};
2.声明一个Thread线程
private Thread mTestThread = new Thread() {
@Override
public void run() {
String name1 = Thread.currentThread().getName();
super.run();
String name = getName();
System.out.println("name====" + name + ",name1=" + name1);
for (int i = 0; i < 5; i++) {
mHandler.sendEmptyMessage(i);
System.out.println("i====" + i);
try {
sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
3.main方法中调用这个线程(注意方法两个步骤)
public void main(String [] args){
mTestThread.run();
// mTestThread.start();
}
4.当运行start()方法时 输出:
System.out: name====Thread-55,name1=Thread-55
System.out: i====0
System.out: msg====0
System.out: i====1
System.out: msg====1
System.out: i====2
System.out: msg====2
System.out: i====3
System.out: msg====3
System.out: i====4
System.out: msg====4
5.当运行run();-->见证奇迹的时刻:
System.out: name====Thread-59,name1=main
System.out: i====0
System.out: i====1
System.out: i====2
System.out: i====3
System.out: i====4
System.out: msg====0
System.out: msg====1
System.out: msg====2
System.out: msg====3
System.out: msg====4
6.原因分析:
在run运行的时候,for循环还是在main线程中运行,(main线程)handler将所有消息添加到消息队列中,for循环执行完毕时,统一处理MessageQueue(消息队列)中的消息
在运行start的时候,for循环在子线程中运行,(子线程)handler每发送一条消息,主线程中handler处理一条消息。循环打印(主线程修改UI);
源码运用:SharedPreferences 的 commit和 apply 的区别
在 apply时,创建了一个一个 Runnable,在另一个 Runnable调用了它的 run(),我当时就有点愣了,其实都是在同一个线程,在那里起到阻塞线程的作用。