失效链接处理 |
深入理解高并发编程(第1版) PDF 下载
本站整理下载:
链接:https://pan.baidu.com/s/1btS0FqFMf--2oeE7JtEkOQ
提取码:1234
相关截图:
![]()
主要内容:
线程的生命周期
1.生命周期
一个线程从创建,到最终的消亡,需要经历多种不同的状态,而这些不同的线程状态,由始至终也构成了线程生命周期的不同阶
段。线程的生命周期可以总结为下图。
其中,几个重要的状态如下所示。
NEW:初始状态,线程被构建,但是还没有调用start()方法。
RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。
package io.binghe.concurrent.executor.test;
/**
* @author binghe
* @version 1.0.0
* @description 实现Runnable实现线程
*/
public class RunnableTest implements Runnable {
@Override
public void run() {
//TODO 在此写在线程中执行的业务逻辑
}
}
package io.binghe.concurrent.executor.test;
import java.util.concurrent.Callable;
/**
* @author binghe
* @version 1.0.0
* @description 实现Callable实现线程
*/
public class CallableTest implements Callable<String> {
@Override
public String call() throws Exception {
//TODO 在此写在线程中执行的业务逻辑
return null;
}
}
BLOCKED:阻塞状态,处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized。
WAITING:表示等待状态,处于该状态的线程需要等待其他线程对其进行通知或中断等操作,进而进入下一个状态。
TIME_WAITING:超时等待状态。可以在一定的时间自行返回。
TERMINATED:终止状态,当前线程执行完毕。
2.代码示例
为了更好的理解线程的生命周期,以及生命周期中的各个状态,接下来使用代码示例来输出线程的每个状态信息。
WaitingTime
创建WaitingTime类,在while(true)循环中调用TimeUnit.SECONDS.sleep(long)方法来验证线程的TIMED_WARTING状态,代码如
下所示。
WaitingState
创建WaitingState类,此线程会在一个while(true)循环中,获取当前类Class对象的synchronized锁,也就是说,这个类无论创建多
少个实例,synchronized锁都是同一个,并且线程会处于等待状态。接下来,在synchronized中使用当前类的Class对象的wait()方
法,来验证线程的WAITING状态,代码如下所示。
BlockedThread
package io.binghe.concurrent.executor.state;
import java.util.concurrent.TimeUnit;
/**
* @author binghe
* @version 1.0.0
* @description 线程不断休眠
*/
public class WaitingTime implements Runnable{
@Override
public void run() {
while (true){
waitSecond(200);
}
}
//线程等待多少秒
public static final void waitSecond(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package io.binghe.concurrent.executor.state;
/**
* @author binghe
* @version 1.0.0
* @description 线程在Warting上等待
*/
public class WaitingState implements Runnable {
@Override
public void run() {
while (true){
synchronized (WaitingState.class){
try {
WaitingState.class.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
BlockedThread主要是在synchronized代码块中的while(true)循环中调用TimeUnit.SECONDS.sleep(long)方法来验证线程的
BLOCKED状态。当启动两个BlockedThread线程时,首先启动的线程会处于TIMED_WAITING状态,后启动的线程会处于BLOCKED
状态。代码如下所示。
ThreadState
启动各个线程,验证各个线程输出的状态,代码如下所示。
运行ThreadState类,如下所示。
可以看到,未输出任何结果信息。可以在命令行输入“jps”命令来查看运行的Java进程。
可以看到ThreadSate进程的进程号为28492,接下来,输入“jstack 28492”来查看ThreadSate进程栈的信息,如下所示。
package io.binghe.concurrent.executor.state;
/**
* @author binghe
* @version 1.0.0
* @description 加锁后不再释放锁
*/
public class BlockedThread implements Runnable {
@Override
public void run() {
synchronized (BlockedThread.class){
while (true){
WaitingTime.waitSecond(100);
}
}
}
}
|