广告
返回顶部
首页 > 资讯 > 精选 >Java并发编程之线程状态实例分析
  • 808
分享到

Java并发编程之线程状态实例分析

2023-06-30 05:06:52 808人浏览 独家记忆
摘要

今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到

今天小编给大家分享一下Java并发编程线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

线程状态概述

线程由生到死的完整过程:

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

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

Java并发编程之线程状态实例分析

睡眠sleep方法

状态中有一个状态叫做计时等待,可以通过Thread类的方法来进行演示。 public static void sleep(long time) 让当前线程进入到睡眠状态,到毫秒后自动醒来继续执行

//主线程执行到sleep方法会休眠1秒后再继续执行public class Test{  public static void main(String[] args){    for(int i = 1;i<=5;i++){      Thread.sleep(1000);        System.out.println(i)       }   }}

等待和唤醒

public void wait() : 让当前线程进入到等待状态 此方法必须锁对象调用。

public class Demo1_wait {    public static void main(String[] args) throws InterruptedException {   // 步骤1 : 子线程开启,进入无限等待状态, 没有被唤醒,无法继续运行.        new Thread(() -> {            try {                System.out.println("begin wait ....");                synchronized ("") {                    "".wait();                }                System.out.println("over");            } catch (Exception e) {            }        }).start();    }

public void notify() : 唤醒当前锁对象上等待状态的线程 此方法必须锁对象调用。

public class Demo2_notify {    public static void main(String[] args) throws InterruptedException {   // 步骤1 : 子线程开启,进入无限等待状态, 没有被唤醒,无法继续运行.        new Thread(() -> {            try {                System.out.println("begin wait ....");                synchronized ("") {                    "".wait();                }                System.out.println("over");            } catch (Exception e) {            }        }).start();        //步骤2:  加入如下代码后, 3秒后,会执行notify方法, 唤醒wait中线程.        Thread.sleep(3000);        new Thread(() -> {            try {                synchronized ("") {                    System.out.println("唤醒");                    "".notify();                }            } catch (Exception e) {            }        }).start();    }}

等待唤醒的一个小例子

定义一个集合,包子铺线程完成生产包子,包子添加到集合中;吃货线程完成购买包子,包子从集合中移除。

  • 当包子没有时(包子状态为false),吃货线程等待.

  • 包子铺线程生产包子(即包子状态为true),并通知吃货线程(解除吃货的等待状态)

public class BaoZiPu extends Thread{    private List<String> list ;    public BaoZiPu(String name,ArrayList<String> list){        super(name);        this.list = list;    }    @Override    public void run() {        int i = 0;             while(true){                    //list作为锁对象                    synchronized (list){                        if(list.size()>0){                            //存元素的线程进入到等待状态                            try {                                list.wait();                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        //如果线程没进入到等待状态 说明集合中没有元素                        //向集合中添加元素                        list.add("包子"+i++);                        System.out.println(list);                        //集合中已经有元素了 唤醒获取元素的线程                        list.notify();                    }                }            }    }}
public class ChiHuo extends Thread {    private List<String> list ;    public ChiHuo(String name,ArrayList<String> list){        super(name);        this.list = list;    }    @Override    public void run() { //为了能看到效果 写个死循环                while(true){                    //由于使用的同一个集合 list作为锁对象                    synchronized (list){                        //如果集合中没有元素 获取元素的线程进入到等待状态                        if(list.size()==0){                            try {                                list.wait();                            } catch (InterruptedException e) {                                e.printStackTrace();                            }                        }                        //如果集合中有元素 则获取元素的线程获取元素(删除)                        list.remove(0);                        //打印集合 集合中没有元素了                        System.out.println(list);                        //集合中已经没有元素 则唤醒添加元素的线程 向集合中添加元素                        list.notify();                    }                }            }    }}
public class Demo {    public static void main(String[] args) {        //等待唤醒案例        List&lt;String&gt; list = new ArrayList&lt;&gt;();        // 创建线程对象                 BaoZiPu bzp = new BaoZiPu("包子铺",list);        ChiHuo ch = new ChiHuo("吃货",list);        // 开启线程        bzp.start();        ch.start();    }}

以上就是“java并发编程之线程状态实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java并发编程之线程状态实例分析

本文链接: https://www.lsjlt.com/news/327432.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java并发编程之线程状态实例分析
    今天小编给大家分享一下Java并发编程之线程状态实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。线程状态概述线程由生到...
    99+
    2023-06-30
  • Java并发编程之线程状态介绍
    目录线程状态概述睡眠sleep方法等待和唤醒等待唤醒的一个小例子线程状态概述 线程由生到死的完整过程: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态...
    99+
    2022-11-13
  • Java并发编程之线程池的示例分析
    这篇文章将为大家详细讲解有关Java并发编程之线程池的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资...
    99+
    2023-06-20
  • Java之JMM高并发编程实例分析
    这篇文章主要介绍“Java之JMM高并发编程实例分析”,在日常操作中,相信很多人在Java之JMM高并发编程实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java之JMM高并发编程实例分析”的疑惑有所...
    99+
    2023-07-02
  • Pthread并发编程之线程基本元素和状态的剖析
    目录前言深入理解 pthread_create基础例子介绍深入理解参数 thread深入理解参数 arg深入理解参数 attr设置线程栈空间的大小自己为线程的栈申请空间使用 mall...
    99+
    2022-11-13
    Pthread 线程元素 状态 Pthread 线程 Pthread并发变成
  • Java并发编程之volatile与JMM多线程内存模型实例分析
    本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”...
    99+
    2023-06-30
  • Java多线程并发、并行、线程与进程实例分析
    本篇内容介绍了“Java多线程并发、并行、线程与进程实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、并发与并行并发:指两个或多个事...
    99+
    2023-07-02
  • java线程池状态有哪些及状态转换实例分析
    这篇文章主要介绍“java线程池状态有哪些及状态转换实例分析”,在日常操作中,相信很多人在java线程池状态有哪些及状态转换实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java线程池状态有哪些及状态...
    99+
    2023-06-30
  • Java线程安全状态的示例分析
    这篇文章主要为大家展示了“Java线程安全状态的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java线程安全状态的示例分析”这篇文章吧。一、观察线程的所有状态线程的状态是一个枚举类型 ...
    99+
    2023-06-29
  • Java并发线程池实例分析讲解
    目录一.为什么要用线程池二.线程池的好处三.原理解析四.4种线程池五.线程池处理流程六.源码分析一.为什么要用线程池 先来看个简单的例子 1.直接new Thread的情况: ...
    99+
    2023-02-02
    Java并发线程池 Java线程池
  • android编程之多线程编程实例分析
    本文实例讲述了android编程之多线程编程实现方法。分享给大家供大家参考。具体分析如下: 该功能与前面《android开发socket编程之udp发送实例分析》中一样,当按下...
    99+
    2022-06-06
    程之 多线程编程 多线程 线程 Android
  • Java线程的状态及常用方法实例分析
    这篇文章主要介绍了Java线程的状态及常用方法实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java线程的状态及常用方法实例分析文章都会有所收获,下面我们一起来看看吧。可以通过 Thread.getSt...
    99+
    2023-06-30
  • MySQL线程状态的示例分析
    这篇文章主要介绍了MySQL线程状态的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。文章目录一、show processlist二、...
    99+
    2022-10-18
  • MySQL主线程状态举例分析
    这篇文章主要介绍“MySQL主线程状态举例分析”,在日常操作中,相信很多人在MySQL主线程状态举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL主线程状态举例...
    99+
    2022-10-19
  • Java并发编程之ConcurrentLinkedQueue源码的示例分析
    这篇文章给大家分享的是有关Java并发编程之ConcurrentLinkedQueue源码的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、ConcurrentLinkedQueue介绍并编程中,一般需...
    99+
    2023-06-15
  • Java面试题之并发编程的示例分析
    小编给大家分享一下Java面试题之并发编程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!面试题1:说一下你对ReentrantLock的理解?ReentrantLock是JDK1.5引入的,它拥有与synchro...
    99+
    2023-06-20
  • JAVA多线程编程实例分析
    今天小编给大家分享一下JAVA多线程编程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.三个售票窗口同时出售20张...
    99+
    2023-06-27
  • Java并发编程之关键字volatile的示例分析
    这篇文章给大家分享的是有关Java并发编程之关键字volatile的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、作用被 volatile 修饰的变量保证了不同线程对该变量操作的内存可见性禁止指令重排...
    99+
    2023-06-15
  • Java并发编程之Fork/Join框架的示例分析
    这篇文章主要介绍了Java并发编程之Fork/Join框架的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、Fork/Join框架的理解ForkJoinTask类属...
    99+
    2023-06-15
  • Java并发编程之线程中断
    目录线程中断: void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设置线程的中断标志为true并立即返回...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作