0%

说明

  Condition在jdk1.5中开始出现,主要是用来替代传统Object对象中的wait和notify方法,Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,前者是java底层级别的(配合synchronized),后者是语言级别的(配合Lock),具有更高的可控制性和扩展性相比来说更加安全和 高效。

阅读全文 »

测试分类

单元测试

  1. 软件测试的最基本单元,针对软件中的基本组成部分进行测试,比如一个模块、一个方法;
  2. 目的是验证最小单位的正确性,其正确性依赖详细设计
  3. 主要方法有控制流测试、数据流测试、排错测试、分域测试等等。
  4. 过程:研发整个过程中需要实施,尤其是针对关键核心代码的准确性测试
  5. 优点:
    • 一个好的单元测试将会在产品开发的阶段发现大部分的缺陷,并且修改他们的成本也很低;
    • 在软件开发的后期阶段,缺陷的修改将会变得更加困难,要消耗大量的时间和费用。
    • 经过单元测试的系统,系统集成过程将会达达的简化。
阅读全文 »

  1. 索引是存储引擎用于快速找到记录的一种数据结构;对于性能的好坏起到决定性的作用
  2. 通过索引号找到对应的数据编号,然后根据编号或对应数据的详细信息
  3. MySQL中的索引在存储引擎中实现
阅读全文 »

抢占式调度

抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。

协同式调度

协同式调度指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。

阅读全文 »

现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待着下次分配。线程分配到的时间片多少也就决定了线程使用处理器资源的多少,而线程优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。优先级高的线程分配时间片的数量要多于优先级低的线程。

阅读全文 »

java中线程的分类:用户线程 (User Thread)、守护线程 (Daemon Thread)。

  1. 守护线程:在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

  2. 区别:用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

Java中的定义

通过Thread中的setDaemon方法完成设置。通过源码分析得知:当线程只剩下守护线程的时候,JVM就会退出.但是如果还有其他的任意一个用户线程还在,JVM就不会退出

阅读全文 »

正常结束(执行完成)

使用退出标志退出线程

一般 run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是设一个boolean类型的标志,并通过设置这个标志为true或false 来控制while 循环是否退出,代码示例:

阅读全文 »

通过Thread构建

Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程。

阅读全文 »

操作系统中的状态

  1. 【初始状态】仅是在语言层面创建了线程对象,还未与操作系统线程关联
  2. 【可运行状态】(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执行
  3. 【运行状态】指获取了 CPU 时间片运行中的状态
    • 当 CPU 时间片用完,会从【运行状态】转换至【可运行状态】,会导致线程的上下文切换
  4. 【阻塞状态】
    • 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入【阻塞状态】
    • 等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】
    • 与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们
  5. 【终止状态】表示线程已经执行完毕,生命周期已经结束,不会再转换为其它状态
阅读全文 »