线程总结

一.创建线程的方式

1)实现Runable接口

     Runable是一个接口,实现它,复写其中的run方法,就会执行内部任务。

2)继承Thread类 (实现了Runable接口)

    继承Thread类,创建一个线程的原因是因为,它实现了Runable类。

3)实现Callable接口(有返回值,同步)

    实现Callable接口创建的线程,会有返回值。这样当一个线程启动了Callable线程,会导致启动线程阻塞,直到callbale线程任务执行完成,返回结果后,启动线程才会继续执行,相当于“同步线程”

4)线程池(通过Thread实现)

    线程池ThreadPoolExector,可以传入Runnable或者Callable作为参数,内部通过缓存Thread,启动线程。

二.启动线程的方式

    启动线程的方式只有Thread类。将Runnale或者Callable作为参数传入,然后调用start方法。

三.线程的生命周期

    线程从创建到销毁,整个流程都是跟cpu的执行权有关,创建后,就是开始等待cpu的执行权,然后进入到运行状态,当发生sleep等中断的时候,线程就进入到阻塞状态,当条件从新满足的时候,线程从新进入到就绪状态,等待cpu的执行权,然后进入的运行状态,最后任务执行完成,进入到线程销毁状态。

阻塞状态分成三种:

等待阻塞:运行状态中的线程执行wait方法,使本线程进入到等待阻塞中。

同步阻塞:线程未获取synchronized同步锁

其他阻塞:通过调用线程的 join ,sleep,或者发出io请求(数据写入本地或者网络请求)。

四.锁的种类

synchronized和Lock

synchronized是jvm层的锁,当发生异常的时候,锁会自动释放掉,该锁具有原子性和可见性。

Lock是个接口,它是java层的锁,子类包括:ReentrantLock(重入锁)和ReadWriteLock(读写锁)。、

 

5.wait和sleep的区别

wait是等待,会释放掉锁资源

sleep锁睡眠,不会释放锁资源

 

6.Interrupt中断机制

 当一个线程正在运行的时候,并且处在阻塞状态, wait,sleep,io阻塞,调用interrupt的时候,就会导致被调用的线程抛出中断异常,从而停止线程。

 

7.Join的实现原理

  让被调用的线程先执行,等被调用线程任务执行完成后,继续向下走。

8.线程池

  ThreadPoolExector是线程池,内部有7个参数。核心线程数,最大线程数,非核心线程存活时间,缓存队列,线程工厂。

 

 

你可能感兴趣的:(android)