0%

线程基础

文章字数:751,阅读全文大约需要3分钟

一、基本概念

1.CPU核心数和线程数关系

  • 一般为1:1关系
  • 英特尔超线程技术可以实现1个核心数2线程
  1. CPU时间片轮转机制
  • RR调度,上线文切换(操作系统处理,程序无关)
  1. 进程和线程
    进程:程序资源分配的最小单位,进程下有多个线程。
    线程:cpu调度的最小单位,需要依附于进程。需要使用进程的资源

  2. 并行和并发
    并发:与时间相关,一定时间内可处理的能力
    并行:程序设计的结构,同一时刻可以处理能力(瞬时)

  3. 高并发编程意义

  • 无关操作可以不用等待
  • 模块化,异步化
  • 可能造成冲突,死锁,资源分配不足等问题。

二、java线程

2.1天然多线程,无需手动开启既有一些线程

1
2
// 虚拟机线程管理接口
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
1
2
3
4
5
Attach Listener
Signal Dispatcher
Finalizer
Reference Handler
main

2.2 线程创建

  1. Thread类(自带的)
  2. Runnable接口(自带的)
  3. Callable有返回值的Runnable,需要用FutureTask包装才能实现一个完整的Runnable并被Thread运行。并且提供了接受返回值的方法(没有结果会阻塞)

2.3 线程退出

  1. 自然执行完
  2. 一场
  3. stop() resume()等方法(不推荐使用,无法释放线程资源已废弃)

2.4线程中断(协作式)

  • myThread.interrupt()中断线程(不是强制型,知识中断通知)设置线程中断标志
  • Thread.currentThread().isInterrupted()判断是否处于中断状态,读取中断标志位。(需要线程内部自己读取状态,实现中断)
  • Thread.interrupted()中断标志设置为false
  • 线程抛出InterruptedException时会复位线程中断位sleepjoin等阻塞的方法都会抛出。需要在catch里重新设置中断标志位,再次中断
  • 线程中阻塞时设置了interrupt()则会抛出InterruptedException异常。即强制通知线程状态的改变。

2.5线程状态

  • 新建,还没有start()
  • 就绪,start()之后,等待操作系统分配运行资源(join方法可以获取执行权)。
    yield()方法可以让线程进入就绪状态,让出当前的运行资源,重写加入等待队列
  • 阻塞,wait()方法进入阻塞,notify()notifyAll()接触阻塞。sleep()休眠固定时间
  • 死亡,stop()setDeamon(),运行结束

2.6线程优先级

Thread.setPriority,1-10的值,不可靠。操作系统不一定会按照此值执行。

2.7守护线程

  1. 和主线程共同退出
  2. 设置setDeamon(true)
  3. 守护线程中try...finally不一定生效finally中不一定会执行,因为守护线程可能回合父级线程一起结束了。