java并发系列(2)——线程概念、状态控制、线程间同步


1、线程概念

进程与线程、后台线程、线程优先级等

注:在Java虚拟机退出时Daemon线程中的finally块并不一定会执行

2、线程状态

java并发系列(2)——线程概念、状态控制、线程间同步_第1张图片

线程状态流转

java并发系列(2)——线程概念、状态控制、线程间同步_第2张图片

注意:

——Java将操作系统中的运行和就绪两个状态合并称为运行状态。阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态,但是阻塞在java.concurrent包中Lock接口的线程状态却是等待状态,因为java.concurrent包中Lock接口对于阻塞的实现均使用的LockSupport类中的相关方法

——查询线程信息

ps -ef | grep wab-app  假如查到的进程pid为21711

top -Hp pid 列出进程中占有cpu最高一些线程,假如最高的线程id为21742(十六进制为54ee)

再执行jstack查看线程信息:jstack 21711 | grep 54ee 输出如下

"PollIntervalRetrySchedulerThread" prio=10 tid=0x00007f950043e000 nid=0x54ee in Object.wait()

3、线程的操作和状态控制

(1)、线程创建;new java.lang.Thread()

一个新构造的线程对象是由其parent线程来进行空间分配的,而child线程继承了parent是否为Daemon、优先级和加载资源的contextClassLoader以及可继承的Thread-Local,同时还会分配一个唯一的ID来标识这个child线程。至此,一个能够运行的线程对象就初始化好了,在堆内存中等待着运行。

(2)、thread.start()

当前线程(即parent线程)同步告知Java虚拟机,只要线程规划器空闲,应立即启动调用start()方法的线程。因此线程并不是立即执行的。

(3)、thread.interrupted()

中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。中断好比其他线程对该线程打了个招呼。

注:如果该线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的isInterrupted()时依旧会返回false。许多声明抛出InterruptedException的方法(例如Thread.sleep(long millis)方法)这些方法在抛出InterruptedException之前,Java虚拟机会先将该线程的中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()方法将会返回false。

(4)、线程暂停、恢复、停止

suspend()、resume()和stop() 不推荐使用

suspend()方法在调用后,线程不会释放已经占有的资源(比如锁),而是占有着资源进入睡眠状态,这样容易引发死锁问题。暂停和恢复操作可以用后面提到的等待/通知机制来替代。

stop()方法在终结一个线程时不会保证线程的资源正常释放,通常是没有给予线程完成资源释放工作的机会,因此会导致程序可能工作在不确定状态下。

安全的终止线程方式——通过标识或者中断,让程序自己停止,释放资源。如下代码

java并发系列(2)——线程概念、状态控制、线程间同步_第3张图片

4、线程间同步

(1)、使用synchronized对象锁

等待方遵循如下原则:

获取对象的锁——如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件(因此代码里用while而不是if判断)——条件满足则执行对应的逻辑。

java并发系列(2)——线程概念、状态控制、线程间同步_第4张图片


通知方遵循如下原则:

获得对象的锁——改变条件——通知所有等待在对象上的线程。

java并发系列(2)——线程概念、状态控制、线程间同步_第5张图片

(2)、JUC中lock、condition

java并发系列(2)——线程概念、状态控制、线程间同步_第6张图片

生产者、消费者

java并发系列(2)——线程概念、状态控制、线程间同步_第7张图片

(3)、Thread.join()方式

如果一个线程A执行了threadB.join()语句,其含义是:当前线程A等待threadB线程终止之后才从threadB.join()返回。线程除了提供join()方法之外,还提供了join(long millis)和join(long millis,int nanos)两个具备超时特性的方法。

java并发系列(2)——线程概念、状态控制、线程间同步_第8张图片

Thread源码中发下thread.join也是通过wait方法实现的

java并发系列(2)——线程概念、状态控制、线程间同步_第9张图片

你可能感兴趣的:(java并发系列(2)——线程概念、状态控制、线程间同步)