模拟多个线程之间的交互
主线程用来更新UI,主线程有默认的消息队列。
线程是通过消息机制来通信的。Message、MessageQueue、Handler、Looper。
public class MyThreads {
private Handler handler1;
private Handler handler2;
public void run(){
run1();
run2();
}
private void run1(){
new Thread(new Runnable() {
@Override
public void run() {
//获得消息队列引用及其循环
Looper.prepare();
//获得消息处理实例
handler1=new Handler(){
//等待线程2计算完成发消息给线程1
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==0x01){
t1();
Message msg1=Message.obtain();
Bundle data=new Bundle();
data.putString("yes","线程1计算完毕");
msg1.setData(data);
handler2.sendMessage(msg1);
}
}
};
Looper.loop();
}
}).start();
}
private void run2(){
new Thread(new Runnable() {
@Override
public void run() {
//获得消息队列引用及其循环
Looper.prepare();
//获得消息处理实例
handler2=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle=new Bundle();
if(msg.getData().getString("yes")=="线程1计算完毕"){
Log.i("yes", "线程1计算完毕");
}
}
};
t2();
//线程2发送消息给线程1
Message msg=Message.obtain();
msg.what=0x01;
handler1.sendMessage(msg);
Looper.loop();
}
}).start();
}
private void t1(){
for(int i=0;i<50;i++){
try {
Thread.sleep(1000);
Log.i("线程1", i+"<<<<<<<");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void t2(){
for(int i=100;i<150;i++){
try {
Thread.sleep(1000);
Log.i("线程2", i+"<<<<<<<");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}