3:线程状态(文末有项目连接)

1:线程状态有多少种?
1. NEW(新建) 线程刚被创建,但是并未启动。还没调用start方法。 
2. Runnable(可 运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操 作系统处理器。 
3. Blocked(锁阻 塞) 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入Blocked状 态;当该线程持有锁时,该线程将变成Runnable状态。
4. Waiting(无限 等待) 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进入这个 状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
5. Timed Waiting(计时 等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态。这一状态 将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep 、 Object.wait。 
6. Teminated(被 终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
2:最常见的等待唤醒机制是哪一种模式?
使用 Object 中的 wait() 方法让线程等待,使用 Object 中的 notify() 方法唤醒线
3:死锁
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行

// wait 与 notify都需要使用在 同步关键字:synchronized 中
// 一个线程wait(等待) 的过程中先把锁释放掉   
// 一个线程被notify(唤醒)后不一定立刻可以获取锁
// 否则会抛出异常IllegalMonitorStateException
// 抛出该异常
//        1:表明某一线程试图等待对象的监视器,
//        2:表明某一线试图通知其他正在等待对象的监视器,然而本身没有指定的监视器的线程。
public class StateThreadDemo {
    public static void main(String[] args) {
        threadState();
//        deadLock();
    }

    /**
     * 线程状态测试
     */
    private static void threadState() {
       Object obj = new Object();
       //    下面是两个线程,一个等待线程,一个唤醒线程,都在一直执行,然后共用同一把锁
        //        演示waiting
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    //注意需要争取锁 锁阻塞
                    synchronized (obj) {
                        try {
                            //计时等待同时释放锁对象(其他地方可以获取到锁)
                            //5秒时间到,自动醒来
                            //obj.wait(5000);
                            System.out.println(Thread.currentThread().getName() + "=== 获取到锁对象,调用wait方法,开始进入waiting状态,释放锁对象");
                            //无限等待同时释放锁对象(其他地方可以获取到锁)
                            obj.wait();
                            //这里无限等待后被唤醒后,并不一定立刻执行
                            // 由于synchronized (obj)   而此刻它已经不持有锁,
                            //所以她需要再次尝试去获取锁(很可能面临其它线程的竞争)
                            //如果没有则需要继续等待
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName() + "=== 从waiting状 态醒来,获取到锁对象,继续执行了");
                    }
                }
            }
        }, "等待线程").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    //每隔3秒 唤醒一次
                    try {
                        System.out.println(Thread.currentThread().getName() + "‐‐‐‐‐ 等待3秒钟");
                        //计时等待 L和没有L都是指毫秒
                        Thread.sleep(1500L);
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //注意需要争取锁  锁阻塞
                    synchronized (obj) {
                        System.out.println(Thread.currentThread().getName() + "‐‐‐‐‐ 获取到锁对象,调用notify方法,释放锁对象");
                        obj.notify();
                    }
                }
            }
        }, "唤醒线程").start();
    }

    /**
     * 死锁测试
     */
    private static void deadLock() {
        Object objA = new Object();
        Object objB = new Object();

        new Thread(() -> {
            while (true) {
                synchronized (objA) {
                    //线程一
                    synchronized (objB) {
                        System.out.println("小何同学正在走路");
                    }
                }
            }
        }).start();

        new Thread(() -> {
            while (true) {
                synchronized (objB) {
                    //线程二
                    synchronized (objA) {
                        System.out.println("小张同学正在走路");
                    }
                }
            }
        }).start();
    }
}

4:消费生产者模式 其中的关键点是,
1.生产是一个一直执行的线程,消费是一个一直执行的线程    
2.而他们使用共同的一把锁(只能同时进行一个线程)
3.每次需要消费线程执行逻辑的时候,必须先等待生产线程的唤醒
4.每次需要生产线程执行逻辑的时候,必须先等待消费线程的唤醒

 消费者步骤:
 进入循环
 1:获取对象锁
 2:判断桌子上是否有包子。
 3:如果没有 
        对象锁等待 等待唤醒   该线程的逻辑一直等待  然后对象锁可以被其他地方获取 
 4:如果有
        包子数减少减1个 当包子数为0时 叫醒等待的生产者继续生产  
           
 生产者步骤:
 进入循环
 1:获取对象锁
 2:判断桌子上是否有包子。
 3:如果有 
    对象锁等待 等待唤醒  该线程的逻辑一直等待  然后对象锁可以被其他地方获取 
 4:如果没有
          包子数加10个 叫醒等待的消费者继续吃               

项目连接

请配合项目代码食用效果更佳:
项目地址:
https://github.com/hesuijin/hesuijin-study-project
Git下载地址:
https://github.com.cnpmjs.org/hesuijin/hesuijin-study-project.git

import-code-demo项目模块下  thread包
    
可阅读stateThreadDemo包下代码
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容