多线程

多线程概念

一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()方法,在main()方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程等。

并发和并行
  • 并发:单核心CPU运行多线程就是并发,并发在微观来说是CPU在同一时刻只能有一个任务在执行
  • 并行:多核心CPU运行多线程程序就是并行,并行在微观来说是CPU在同一时刻有多个任务在执行
线程常用方法
  • currentThread(),当前线程

  • getId(),获取线程唯一编号

  • setName()/getName(),线程名称

  • start(),开启新的线程

  • run(),在当前线程中执行

  • isAlive(),线程活动状态

  • sleep(),属于Thread 的方法,休眠毫秒,不释放锁

  • yield(),属于Thread 的方法,交出cpu使用权,不释放锁

  • join(),属于Thread 的方法,让调用join方法线程先执行完成,不释放锁

  • wait(),属于Object 方法,进入等待状态,释放锁。

  • notify(),属于Object 方法,唤醒(对象监视器)单个线程,释放锁。

  • notifAll(),属于Object 方法,唤醒(对象监视器)等待全部线程,释放锁。

  • setPriority(num),设置线程优先级(1-10)

  • interrupt(),中断线程,只是打一个中断标记,并不是真正的停止

  • isInterrupted(),线程中断标记。循环体中break;return;进行中断。

  • setDaemon(),守护线程,垃圾回收器就是守护线程,守护线程不能单独执行,只剩守护线程会自动销毁,监控别的线程,main线程结束,守护线程也结束了。

线程生命周期介绍
  • NEW,新建状态,调用start()启动之前

  • RUNNABLE,可运行状态,复合状态包括(READY,RUNNING)READY可以被线程调度器进行调度,RUNNING 标识该线程正在执行。Thread.yield(),可以把线程从RUNNING状态修改成READY状态

  • BLOCKED,阻塞状态,线程发起阻塞IO请求,申请独占资源(申请锁),进入阻塞状态,不会占用CPU资源,线程获得申请的资源,转换成RUNNABLE状态。

  • WATTIING,等待状态,想成执行了wait,join方法,会把线程转换成 等待状态,执行了notify,方法或者加入的线程执行完毕,当前线程转换为 RUNNABLE状态

  • TIMED_WAITING,超时等待,调用Thread.sleep(long),或者wait(long),进入超时等待状态。不会无限等待,没有在指定时间完成期望操作,自动转换为RUNNABLE

  • TERMINATED,终止状态

线程状态图

image.png

posted @ 2018-08-28 18:55  微辰  阅读(318)  评论(0编辑  收藏  举报