您的位置:首页 > 编程语言 > Java开发

Java多线程学习笔记(一) Thread

2019-10-11 07:05 1731 查看

1. 线程的生命周期

如图所示线程的生命周期大致分为五个阶段:

  • NEW
  • RUNNABLE
  • RUNNING
  • BLOCKED
  • TERMINATED

2. 守护线程

守护线程是一个比较特殊的线程,一般处理后台的工作,如jdk的垃圾回收线程。

Q: JVM在什么时候会退出?

A: 若JVM中只剩下守护线程中在运行,没有其他线程的时候,JVM的进程就会退出,因为守护线程有自动结束生命周期的特性。

如何设置线程为守护线程

public static void main(String args[]){
Thread thread = new Thread(...);
thread.setDaemon(true);
thread.start();
}

在上面示例中,通过调用setDaemon方法并传入参数true后,启动后的线程即为守护线程。

如果某线程的父线程为非守护线程,默认情况下子线程也为非守护线程;反之亦然。

3. 线程API

3.1 sleep方法

sleep方法会使当前线程进入指定毫秒数的休眠,但是并不放弃monitor锁的所有权。

3.2 TimeUnit

TimeUnit类代替Thread.sleep()方法实现休眠更加方便,可以直接指定时分秒,省略单位的划算。

3.3 yield方法

使用yield方法表示提醒调度器我愿意放弃当前CPU资源,使得当前线程从RUNNING状态转换为RUNNABLE状态。

3.4 线程优先级

  • 线程的优先级范围为从1到10。
  • 线程的优先级默认和父线程优先级一致,一般都是5。
  • 可以调用Thread.setPriority()方法来修改线程优先级。

3.5 线程ID

通过调用Thread.getId()方法来获取当前线程ID,具有唯一性。

3.6 获取当前线程

Thread.currentThread()用以返回当前执行线程的引用。

3.7 线程interrupt

当线程处于阻塞状态下时可以执行interrupt方法被中断,被打断后会抛出一个InterruptedException异常。

3.8 线程join

join某个线程A,会使当前线程B进入等待,直到线程A结束,在此期间线程B是处于BLOCKED的。

4. 线程的三大特性

4.1 原子性

原子性即所有操作要么全部执行,要么全部不执行,并且执行过程中不会被其他线程打断。 使用synchronized关键字以及Lock框架以及Atomic包可以实现原子性。

4.2 可见性

可见性即当一个线程修改共享变量之后,能立即被其他线程识别该变量的更新,使用synchronized关键字和volatile关键字可以实现可见性。

4.3 有序性

  • Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。使用volatile和synchronized关键字以及Lock框架可以实现有序性。

4.3.1 有序性的happens-before原则

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  • 锁定操作:一个unlock操作先行发生于后面对同一个锁的lock操作
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
  • ......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: