1.1 使用内核线程实现
实现方式
优势及局限性
优势
局限性
1.2 使用用户线程实现
实现方式
优势及不足
优势
劣势
1.3 混合实现
实现方式
优势
上面所说的3中实现方式是跟具体语言无关的实现,对应到java语言来看,java线程的实现使用的是哪种方式呢?这就需要看jdk的版本了。
2.1 JDK1.2之前
基于名为“绿色线程”(Green Thread)的用户线程实现。
2.2 JDK1.2之后
线程模型被替换为基于操作系统原生线程模型来实现—native
3.1 协调式线程调度
实现方式
好处
缺点
3.2 抢占式线程调度
实现方式
优势
3.3 疑问:Java Thread类中的优先级设置靠谱吗,对线程的调度影响有多大?
4. 线程的6种状态转换
4.1 线程的六种状态
Java线程既然能够创建,那么也势必会被销毁,所以线程是存在生命周期的,那么我们接下来从线程的生命周期开始去了解线程。线程一共有6种状态,详见java.lang.Thread类中定义的枚举:State
java.lang.Thread.State
/**
* @since 1.5
* @see #getState
*/
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
4.2 线程的状态转换
4.2.1 验证New状态
/**
* 验证线程的New状态
*/
@Test
public void testNew(){
Thread t = new Thread(()->{},"new Thread");
System.out.println("线程的状态:"+t.getState());
}
4.2.2 验证Runable转Waiting状态
4.2.2.1 调用wait()方法
@Test
public void testWait() throws InterruptedException {
Object lock = new Object();
Thread t = new Thread(()->{
synchronized (lock){
try {lock.wait();}
catch (InterruptedException e)
{e.printStackTrace();}
}
},"t1");
t.start();
TimeUnit.SECONDS.sleep(1);
System.out.println("线程的状态:"+t.getState());
}
4.2.2.2:调用join()方法
验证代码
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{while (true){}},"t1");
t1.start();
t1.join();
}
验证结果
4.2.2.3 调用LockSupport.park()方法
验证代码:
public static void main(String[] args) throws InterruptedException {
LockSupport.park();
}
验证结果:
4.2.3 验证Runable转TimedWaiting状态
方式1:wait(long)
验证代码
private static Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
synchronized (lock) {
lock.wait(100000);
}
}
验证结果:
方式2:join(long)
验证代码
public static void main(String[] args) throws InterruptedException{
Thread t1 = new Thread(()->{ while (true){}},"t1");
t1.start();
t1.join(30000);
System.out.println("不再等待了!");
}
验证结果
方式3:sleep(long)
验证代码
public static void main(String[] args) throws InterruptedException {
Thread.sleep(50000);
}
验证结果
方式4:LockSupport.parkUntil(long)或LockSupport.parkNanos(long)
验证代码
public static void main(String[] args) throws InterruptedException {
LockSupport.parkUntil(System.currentTimeMillis()+100000);
//LockSupport.parkNanos(System.currentTimeMillis()+100000;
}
验证结果
4.2.4 验证Runable转Blocked状态
验证方式:synchronized锁
验证代码
private static void blockedMethod(){
synchronized (TestBlocked.class){
while (true){}
}
}
public static void main(String[] args) throws IOException {
new Thread(TestBlocked::blockedMethod,"t1").start();
new Thread(TestBlocked::blockedMethod,"t2").start();
}
验证结果
本节内容详细介绍了线程的3种实现方式,从中可以了解到jdk不同的版本中的实现方式是不同的;介绍了线程调度的两种方式,了解到java线程是采用“抢占”方式调度的;详细介绍了线程的状态及变更流程,并对关键的状态变化进行了代码层面的分析和验证,从而可以对Thread类相关的核心API及原理有个较为清晰的认识和理解。
获取以上Java高级架构最新视频,欢迎
加入Java进阶架构交流群:142019080。直接点击链接加群。https://jq.qq.com/?_wv=1027&k=5lXBNZ7