• JavaSE_03_Thread类02


    1.1 线程状态概述

    当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中, 有几种状态呢?在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态:

    线程状态 导致状态发生条件
    NEW(新建) 线程刚被创建,但是并未启动。还没调用start方法。
    Runnable(可 运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操 作系统处理器。
    Blocked(锁阻 塞) 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状 态;当该线程持有锁时,该线程将变成Runnable状态。
    Waiting(无限 等待)  一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个 状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
    Timed Waiting(计时 等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、 Object.wait。
    Teminated(被 终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。

    1.2 Timed Waiting(计时等待)

    Timed Waiting在API中的描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。

    Thread.sleep(1000)//等待1秒后自己唤醒自己

    1.3 BLOCKED(锁阻塞)

    Blocked状态在API中的介绍为:一个正在阻塞等待一个监视器锁(锁对象)的线程处于这一状态。

    比如,线程A与线程B代码中使用同一锁,如果线程A获 取到锁,线程A进入到Runnable状态,那么线程B就进入到Blocked锁阻塞状态。等待线程A执行完成后线程B转换为Runnable状态

     1.4 Waiting(无限等待)

    Wating状态在API中介绍为:一个正在无限期等待另一个线程执行一个特别的(唤醒)动作的线程处于这一状态。必须由另一个线程通过 obj.notify(), obj.notifyAll() 唤醒

    在同一个锁中通过 obj.wait()方法使线程进入无限等待状态

    在同一个锁中通过 obj.wait()方法使线程进入无限等待状态转为锁阻塞状态,等待获得锁对象转化为可运行状态。

     1.5 6种状态的转换

    1.6带参数的等待唤醒

    obj.wait();使当前相称进入无线等待状态,需要通过obj.notify()唤醒,进入锁阻塞状态。

    obj.wait(2000);使当前相称进入无线等待状态,2秒后自动进入锁阻塞状态。

    1.7线程之间的通信(在同一个锁中,但在不同的线程中)

    /*
     *  等待线程唤醒:线程之间的通信
     *  调用wait方法,放弃cpu的执行 进入到waiting状态(无限等待)
     *  调用notify方法
     *  
     *  必须在同一同步代码块中,保证等待和唤醒只能有一个执行
     */
    public class Demo10_等待唤醒_线程之间的通信 {
        public static void main(String[] args) {
            // 创建锁对象保证唯一
            Object obj = new Object();
            // 创建一个消费者线程
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        // 保证等待和唤醒的线程只能有一个 需要使用同步技术
                        synchronized (obj) {
                            System.out.println("我需要一瓶水");
                            try {
                                obj.wait();
                                // obj.notify();唤醒线程之后执行 obj.wait();后的代码
                                System.out.println("消费者拿到了商品");
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }.start();
    
            // 创建一个生产者
            new Thread() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            // 花了1秒准备商品
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                        synchronized (obj) {
                            System.out.println("生产商品需要1秒");
                            // 唤醒消费者告知 商品已经完成
                            obj.notify();
                        }
                    }
                }
            }.start();
        }
    }

     

     

     

  • 相关阅读:
    面向对象-类与实例化对象
    面向对象-面向对象与面向过程优缺点
    pyCharn文件模板变量
    安装pycrypto以及报错处理
    文件-读、写、追加已经文件操作
    文件-读取与编码检测
    运算-三元运算
    三方工具-sqlacodegen
    函数-生成器之斐波拉契数列
    python内存-fromkeys
  • 原文地址:https://www.cnblogs.com/asndxj/p/11728987.html
Copyright © 2020-2023  润新知