让你学会与理解Java的线程与并发(四,线程状态)

Posted 韶光不负

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让你学会与理解Java的线程与并发(四,线程状态)相关的知识,希望对你有一定的参考价值。

欢迎大家观看,下面与小编一起来看看,接下来的学习吧!

线程状态

从操作系统分析 (五种状态)

从操作系统分析线程状态
初始状态仅仅创建了线程对象,并没有与操作系统关联
可运行状态创建了线程对象(与操作系统关联),可以用cpu调度执行
运行状态获取cpu时间片运行中的状态,(当时间片使用完后(程序没有完成),线程会从运行状态返回可运行状态:导致线程上下文切换)
阻塞状态如果调用了阻塞的API,导致线程使用不了CPU,线程进行上下文切换,进入阻塞状态。(当阻塞API完成后,操作系统会重新唤醒线程,线程进入可运行状态)
终止状态当线程所有代码执行完毕,线程从运行状态到终止状态(到终止状态后,线程状态不会改变)

 

Java PAI (六种状态,根据Therad.State 枚举分类)

TIMED_WAITING,WAITING,BLOCKED都是线程阻塞状态的细分

从JAVA API分析线程状态
NEW (新的)
线程刚刚被创建,没有调用start()启动线程
RUNNABLE (可运行的)
调用start()启动线程,(Java可运行状态包括了操作系统的可运行,运行与阻塞状态。)
BLOCKED (阻塞)
一个正在阻塞等待一个监视器锁的线程处于这一状态。(I/O 的阻塞是不同的,它不是一般意义上的阻塞,而是特指被 synchronized 块阻塞,即是跟线程同步有关的一个状态。)
WAITING(等待)
当调用wait()方法调用后,线程进入TIMED_WAITING状态
TIMED_WAITING (定时 等待)
当调用sleep()方法时,线程放弃cpu的使用权,线程进入TIMED_WAITING状态
TERMINATED  (终止)
当线程代码全部运行完成,线程从可运行状态到终止状态

 

练习:烧开水(华罗庚-统筹办法)

洗水壶(2分钟) ,煮开水 (20分钟) ,洗茶具(4分钟),找茶叶(3分钟)

用sleep()方法模拟等待时间,使用多线程设计方案。




public class Text 

    public static void main(String[] args) throws InterruptedException 

        Thread t1 = new Thread(()->
            try 
                System.out.println("洗茶壶");
                Thread.sleep(2000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            try 
                System.out.println("烧开水");
                Thread.sleep(5000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
        ,"张三");

        Thread t2 = new Thread(()->
            try 
                System.out.println("洗茶具");
                Thread.sleep(4000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            try 
                System.out.println("找茶叶");
                Thread.sleep(3000);
             catch (InterruptedException e) 
                e.printStackTrace();
            
            try 
                t1.join();//等张三完成一起泡茶
             catch (InterruptedException e) 
                e.printStackTrace();
            
            System.out.println("可以了,泡茶了");
        ,"王五");
        t1.start();
        t2.start();
    

以上是关于让你学会与理解Java的线程与并发(四,线程状态)的主要内容,如果未能解决你的问题,请参考以下文章

让你学会与理解Java的线程与并发(一,线程与进程,并发)

让你学会与理解Java的线程与并发(二,创建运行与常见方法)

让你学会与理解Java的线程与并发(三,设计二阶段终止与常见方法)

浅剖Java进程与线程

别翻了,这篇文章就是要让你入门java多线程!

Java并发编程与技术内幕:线程池深入理解