Thread和Runnable的区别

多线程的实现有两种方式,一种是继承thread,还有一种是实现Runnable接口,推荐使用后者,由于java是单继承,若是继承了thread以后,就没法继承其余类了。显然RUnnable更加灵活一点。java

实现Runnable,比之thread的优点:bash

  • 避免因为java单继承带来的局限性。
  • 相比于继承thread更能描述数据共享的概念。

不管是实现Runnable仍是继承Thread的方法来实现多线程,他的启动都是从start开始的,而不是在run方法。若是调用了run,那么run方法内部的代码块实际上仍是执行在当前线程的。数据结构

理由: 当启动一个线程的时候,操做系统会为其分配资源,在start方法中不只执行了多线程的代码,除此还调用了start0方法,该方法的声明是native额,在java语言中有一种技术叫作jni,即JavaNativeInterface,该技术的特色是调用本机操做系统提供的函数,可是有一个缺点是不能离开特定的操做系统,若是线程须要执行,必须有操做系统去分配资源,因此此操做是JVM根据不一样的操做系统实现的。多线程

若是多线程是经过实现Runnable来实现的,此时与继承thread实现有一个区别,那就是Runnable没有start方法,而多线程必须由start方法启动,因此这里必须调用Thread类的一个构造方法Thread(RUnnable target), 该构造方法获得了Runnable接口的一个实现,因而就能够经过调用start方法开启多线程了。ide

消息机制主要指的是Handler的运行机制,它的运行须要底层的MessageQueue和Looper支撑,MessageQueue以队列的形式对外提供插入和删除的工做,虽然叫消息队列,可是其实是采用的单链表的数据结构来存储消息的。函数

实现Runnableoop

class MyRUnnable() : Runnable {
    override fun run() {
        //...代码逻辑
        
        val msg: Message = Message.obtain()
        handler.post(msg)
    }
}
复制代码

启动多线程post

val thread = Thread(MyRunnable())
thread.start()
复制代码

处理多线程的返回spa

val handler = object: Handler() {
    override fun handlerMessage(msg: Message?) {
        msg?.let {
            ///...逻辑代码
        }
    }
}
复制代码
相关文章
相关标签/搜索