zoukankan      html  css  js  c++  java
  • Android里的多线程知识点

    1.Thread类与Runnable接口

    子类继承Thread类实现跑自己逻辑的run方法,在调用Thread类的start方法后,会自动调用run方法,该对象只可以调用一次start方法,即Thread类对象的作用就是另起一个线程跑一段代码

    跑的这段代码既可以放在Thread子类里,也可以放在实现了Runnable接口的类里,这样更灵活(资源共享)

    Runnable接口则定义在libcore/luni/src/main/java/java/lang/Runnable.java,本身很简单,只有一个run方法,代表可以执行的对象,实现了该接口的类可以作为参数传给Thread类的构造函数,然后调用该Thread对象的start方法即可自动调用被实现了的run方法(Interface Segregation Principle)

    一般都实现Runnable接口,好处一是不用继承Thread类,Java是单继承,所以要用接口;二是不同的线程之间可以共享资源(同一份变量都可以访问),Thread类的同对象不可以多次调用start方法,而实现了Runnable接口的对象可以多次传给不同的Thread类对象来通过start调用run方法

    最后强调一下,我们的目的是要一段代码在多个线程里跑,用Thread子类的方法把代码承载在Thread子类上,导致要有多个Thread子类对象,无法是代码共享子类中的资源;用Runnable接口的办法可以实现资源共享,因为一个实现了该接口的类可以传给多个Thread对象,这是一种解偶,Thread对象只负责开线程,运行该代码即可(Law of Demeter,Single Responsibility Principle)

    2.Executor,ExecutorService,Executors,ThreadPoolExecutor

    线程池技术,预先创建线程,将创建线程的消耗摊薄在任务上(初始化相应策略的线程池类,分配线程资源,等待执行),并通过不同任务挂靠在池中不同线程上排队解决因请求太多而资源不足的问题

     Executor接口代表了执行一段代码,只有一个execute方法,接受Runnable参数,实现这个方法的具体类决定了执行Runnable代码的策略(调度任务的方式和时间)。Executor将任务提交/执行与任务如何运行分离开来

    ExecutorService代表了线程池,是个接口,继承于Executor,提供了更丰富的方法开控制异步与并发。用它来为Runnable接口提供并发执行的接口

    线程池里的任务一定要手动关闭,Future接口代表异步任务的执行状况

    CompletionService及这个接口的具体实现类ExecutorCompletionService用以简化等待任务执行结果的过程

    Executors是个类,使用工厂模式创建各种策略的具体线程池(ExecutorService)

     Executors只有一个直接实现类ThreadPoolExecutor和间接实现类ScheduledThreadPoolExecutor

    ThreadPoolExecutor和ScheduledThreadPoolExecutor是Executors的实现类,提供具体的算法

    3.Callable接口

    Callable接口与Runnable接口类似,不同的是他是一个泛型接口,要实现call方法,并且可以返回对象,抛出checked异常

    Callable接口与Future接口,FutrueTask结合使用结合在一起可以获得一个Future类,用以查询状态,取消执行,获得执行结果

    ExecutorService的submit方法可传入一实现Callable接口的对象,自动执行里边的call函数

    4.Handler

    Android有个特性,UI控件不让在主线程之外的线程修改,所以引入Handler机制,来实现线程之间的通信

    Handler与new它的线程绑定(每个handler关联了一个线程),其他线程通过sendMessage发送消息给Handler来处理相应消息下的代码;或者是post发法发送一段代码(Runnable对象)给Handler,让其自动调用其中的run方法,run方法里有相关交互逻辑

    与Handler相关的类还有Message,MessageQueue,Looper

    Message有what,arg1,arg2,obj,setData,getData等方法与域

    Message放在MessageQueue里,Loop会循环等待读取MessageQueue里的Message,发送给Handler来处理

  • 相关阅读:
    vuejs组件交互
    markdown table语法
    vue循环中的v-show
    apache跨域
    sublime text执行PHP代码
    PHP语法
    方法(method)和函数(function)有什么区别?
    PHP MVC单入口
    phpstudy部署thinkPHP
    MACD判断定背离,底背离
  • 原文地址:https://www.cnblogs.com/cascle/p/5502820.html
Copyright © 2011-2022 走看看