线程

线程构造方法:

  1. 设置线程名
  2. 线程的任务
  3. 设置线程分组

线程的常用属性:

ID,Name…状态
优先级(1-10 默认5)
守护线程(后台线程)

守护线程注意:
1.在守护线程里面创建的线程,默认是守护线程
2.守护线程状态的设置必须放在线程启动之前

start和run方法的区别

run属于普通方法,start是启动线程的方法
run方法可以执行多次,start方法只能执行一次

线程中断:

使用全局自定义的变量来终止线程-------------------->收到终止指令后,会执行完当前任务再终止
使用线程提供的终止方法 interrupt 来终止线程---->收到终止指令之后,立马终止

使用线程提供的方法 stop 来终止线程(弃用,终止之后,未释放资源,有安全隐患)

终止线程
Thread.interrupted()方法,判断完线程状态之后,就会将线程状态设置为false;
Thread.currentThread.isInterrupted()方法,执行判断线程终止为true之后,

等待一个线程
join()

获取当前线程引用
currentThread()

线程状态

NEW------------------->新建状态,没有调用start()之前的状态
RUNNABLE---------->运行状态,(running执行中,ready就绪(等待cpu时间片))
BLOCKED------------>阻塞状态,多个线程试图获得同一把锁
WAITING-------------->等待状态,没有明确的等待结束时间,调用wait()
TIMED_WAITING—>超时等待状态,有明确的等待时间,如:sleep(xxx)
TERMINATED-------->终止状态

yield()
出让CPU执行权,特点:不一定能成功出让cpu执行权

线程安全

线程不安全:多线程执行中,程序的执行结果和预期的不相符,就叫做线程不安全

线程非安全

  1. cpu抢占式执行(万恶之源)
  2. 非原子性
  3. 编译器优化(代码优化)编译器优化在单线程下没问题,可以提升程序的执行效率,但是在多线程下就会出现混乱,导致线程不安全问题(指令重排序)
  4. 内存不可见
  5. 多个线程修改了同一个变量

volatile 关键字(轻量级解决“线程安全”)

解决问题:

  1. 强制内存可见(原理:当操作完变量之后,强制删除线程工作内存中的此变量)
  2. 禁止指令重排序

注意:
volatile不能解决原子性问题

解决线程安全:

  1. CPU抢占调度(不能解决)
  2. 每个线程操作自己的变量(可能解决)
  3. 在关键代码上让所有CPU排队执行,加锁;

加锁操作的关键步骤

  1. 尝试获取 (如果成功拿到锁,加锁,没拿到就等待)
  2. 释放锁

Java中解决线程安全问题的方案:

版权声明:玥玥 发表于 2021-05-02 16:55:09。
转载请注明:线程 | 女黑客导航