【Android】java 线程中的run和start神奇使用

 

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(),我当时就有点愣了,其实都是在同一个线程,在那里起到阻塞线程的作用。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值