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
- ......
相关文章推荐
- java多线程学习笔记(一) ——Thread
- [置顶] Java 多线程学习笔记(十) InheritableThreadLocal的使用
- Java多线程学习笔记(二) ThreadGroup
- Java 多线程中 Thread类 join方法的使用
- Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
- Maven运行异常:Exception in thread "main" java.lang.UnsupportedClassVersionError
- java threadLocal 测试
- Hibernate3.3以上版本报Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Cacheable异常
- java中的线程-继承thread-实现runnable接口以及线程同步
- Java 给Thread传递参数
- How to Analyze Java Thread Dumps
- Java多线程系列二——Thread类的方法
- java中Thread类中的start()方法与run()方法
- Java中Runnable和Thread的区别
- Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
- 利用Java线程Thread实现接口Runnable接口使图片动起来
- Java>多线程>>创建多线程程序的两种方法(创建Thread类的子类、实现Runnable接口)
- Java Thread 应该注意的一些问题
- Java 里的thread (线程)简介
- JAVA中的多线程之Thread,Runnable和Callable