美文网首页
Android-线程

Android-线程

作者: 有腹肌的豌豆Z | 来源:发表于2020-08-24 09:31 被阅读0次

什么是线程?

  • 线程指的是进程中的一个控制单元,也就是进程中的每个单元任务,一个进程中可以有多个线程同时并发运行。
  • 线程的执行是通过CPU调度器来决定的,程序员无法控制。
  • 线程是进程的基本组成单元,故也把线程称作进程元,或者轻型进程。
  • 对于线程来说:堆内存空间是共享的,栈内存空间是独立的;线程消耗的资源比进程要小得多,且线程之间是可以相互通信的。

线程的状态/生命周期

public enum State {
        /**
         * 尚未启动的线程的线程状态。 刚创建出来的线程 new Thread()
         */
        NEW,

        /**
         * (可运行/运行状态,等待CPU的调度)(要注意:即使是正在运行的线程,状态也是Runnable,而不是Running) 
         */
        RUNNABLE,

        /**
         * 等待监视器锁而被阻塞的线程的线程状态。运行被synchronized标记的代码且未获取到同步监视器。
         * 阻塞状态
         */
        BLOCKED,

        /**
         * 等待指定时间time threadA中调用threadB.join(time)。
         * obj.wait(time) 
         * sleep(time)。
         */
        TIMED_WAITING,

        /**
         * 线程终止,线程执行完成。
         */
        TERMINATED;
    }

停止线程

有时候我们可能需要强制中断 run() 方法的执行,怎么办呢?是使用 stop() 方法还是 interrupt() 方法呢?正确的姿势是调用 interrupt() 方法

  • stop() 方法会真的杀死线程,不给线程一点儿喘息的机会,如果被杀死的线程持有 synchronized 隐式锁,那就再也不会释放掉这个锁了,接下来的线程也就没办法获得 synchronized 隐式锁,是不是特别危险?同样 suspend() 和 resume() 这两个方法也是不建议使用。废弃了。
  • interrupt() 方法相比于 stop() 方法就温柔很多,它只是通知线程后续的操作可以不用去执行了,线程可以选择执行现在就不执行,当然也可以选择再执行一段时间后再停止,或者我就不听你的,非要执行完,都没关系, interrupt() 只是通知一下你而已。就比如你要做火车去一个地方,突然通知你这个火车晚点了,你可以选择无视这个通知继续等待,或者选择另外一趟高铁,但是不管你做什么,和火车站都没啥关系,它通知的责任尽到了。

线程状态函数

wait()

  • 使一个线程处于等待状态,并且释放所有持有对象的lock锁,直到notify()/notifyAll()被唤醒后放到锁定池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable)。

sleep()

  • 使一个线程处于睡眠状态,是一个静态方法,调用此方法要捕捉Interrupted异常,醒来后进入runnable状态,等待JVM调度。

notify()

  • 使一个等待状态的线程唤醒,注意并不能确切唤醒等待状态线程,是由JVM决定且不按优先级。

allnotify()

  • 使所有等待状态的线程唤醒,注意并不是给所有线程上锁,而是让它们竞争。

join()

  • 使一个线程中断,IO完成会回到Runnable状态,等待JVM的调度。

Synchronized()

  • 使Running状态的线程加同步锁使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)。

Synchronized 同步

  • 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
  • 补充: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。
1、方法同步。
  • 给方法增加synchronized修饰符就可以成为同步方法,可以是静态方法、非静态方法,但不能是抽象方法、接口方法。
  • 线程在执行同步方法时是具有排它性的。
  • 当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。
  • 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
2、块同步。
  • 同步块是通过锁定一个指定的对象,来对块中的代码进行同步;同步方法和同步块之间的相互制约只限于同一个对象之间,静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例没有关系。
  • 如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块。

相关文章

  • Android-线程

    什么是线程? 线程指的是进程中的一个控制单元,也就是进程中的每个单元任务,一个进程中可以有多个线程同时并发运行。 ...

  • Android-Threadpool

    关于线程我不想再说什么,感兴趣的同学可以看我之前写过的一篇文章:Android-多线程,这里对线程有一个比较详...

  • Android-多线程

    一:线程相关概念 聊多线程之前,我们先说一说线程,说线程之前,我们了解一下进程。 1.什么是进程? 通俗的...

  • Android-线程池

    线程池就是创建若干个可执行的线程放入一个池(容器)中,有任务需要处理时,会提交到线程池中的任务队列,处理完之后线程...

  • Android Studio 视图结构

    1、Tools->Android->Layout Inspector2、Tools->Android->Andro...

  • android-线程管理-TaskHelper

    以前线程总是使用new Thread().start()这种方式,或者使用线程池ThreadPoolExecuto...

  • 日更(十三)-Android-线程

    瞎扯 感觉标题还是不要写挑战了,有点逗今天写的...其实我对线程也不是特别熟练.写写我自己的理解,不是写怎么用线程...

  • A008-drawable资源

    关于drawable资源笔者之前有写过两篇文章:Android-自定义图像资源的使用(1)Android-自定义图...

  • Android-如何生成 keystore

    Android-如何生成 keystore Be a king in your mind, but do the ...

  • 解决Gradle project sync failed. Pl

    点击tools->Android->Sync Project with Gradle Files.

网友评论

      本文标题:Android-线程

      本文链接:https://www.haomeiwen.com/subject/slmgjktx.html