[多线程-1]. 啥是多线程

多线程机制

首先多线程是Java内置对多线程的支持,顾名思义多线操作,一个应用中存在几个执行体.
要注意的一点是,多线程实际上是JVM快速的在多个线程中来回切换,这些线程被轮流执行,使每个线程都有机会使用cpu资源

main线程

  1. 每个java程序都有一个缺省的主线程,JVM加载代码,发现main方法后就会启动一个线程称为主线程
  2. 在main方法中再创建的其他线程称为其他线程

线程的状态与生命周期

(许多文章对于线程状态都有不同的解释,按自己理解就好,[菜鸟教程参考链接]

  1. 新建状态
    使用 new 关键字和 Thread 类或其子类建立一个线程对象后,具有相应内存空间,但是不处于JVM管理的线程中.

  2. 就绪状态
    线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。

  3. 运行状态
    如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。
    当JVM将CPU使用权切换给线程时,如果线程是Thread子类创建的,该类中的run()方法就会立刻执行,且run()方法必须重写,因为Thread类中run()方法没有具体内容.
    在run()方法结束前,不要再让线程调用start()方法,否则会发生IllegalThreadStateException异常.

  4. 阻塞状态/中断状态
    如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:

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

    • 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。

    • 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。

  5. 死亡状态
    线程正常完成全部工作或被提前强制终止使线程不具备继续运行的能力,随之释放分配给线程对象的内存.

线程调度和优先级

JVM中的线程调度器负责管理线程,线程优先级分为1-10.

  • 线程优先级调整:setPriority(int newPriority)
  • 查看当前线程对象优先级:getPriority()
  • main线程优先级为默认优先级5
  • java线程调度器的任务是高优先级的线程始终能运行.一旦时间片有空闲,使具有相同优先级的线程以轮流的方式顺序使用时间片.(但是不推荐使用线程优先级来保证算法的正确运行)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。