多线程:创建Thread为什么要调用start启动,而不能直接调用run方法

来源:互联网 发布:matlab读取excel数据 编辑:程序博客网 时间:2024/06/06 10:05

    最近在学习Android Service时遇到这样多线程问题。

    start()方法启动线程后,整个线程处于就绪状态,等待虚拟机调度, 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。期间虚拟机是分时间片轮番调用各个线程体的。


   run()方法启动是当作普通方法的方式调用,这里虚拟机不会线程调度,虚拟机会执行这个方法直到结束后自动退出。


参考进程、线程调度,javaThread生命周期。

package com.example.wangchuncheng.myservice;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class MyService extends Service {    private boolean running = false;    private String data  = "这是默认信息";    public MyService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        throw new UnsupportedOperationException("Not yet implemented");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        data = intent.getStringExtra("data");        return super.onStartCommand(intent, flags, startId);    }    @Override    public void onCreate() {        super.onCreate();        running = true;        new Thread(){            @Override            public void run() {                super.run();                while(running){                    System.out.println(data);                    try {                        sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }.start();        //这里使用run的话,开始服务后会卡死,导致程序无响应    }    @Override    public void onDestroy() {        super.onDestroy();        running = false;    }}



阅读全文
0 0
原创粉丝点击