我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java线程的全方位详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java线程的全方位详解

❤️‍大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!❤️‍

先来看一下线程这张图线程的几种运行状态之间运行流程:

在这里插入图片描述

看不懂没关系,慢慢来学习,往下学习来继续了解一下~

什么是线程?

  • 线程是进程的一部分,是程序执行中的一条执行路线;
  • 进程就是指程序在其自身地址空间的一次执行活动,是程序独立运行的基本单位;
  • 一个进程可以包含多条线程,一个条线程对应一个进程中的一条执行路线。

在这里插入图片描述

线程的几种创建方式?

主要由四种方式创建线程:

在这里插入图片描述

  • 方式1:继承Thread类,重写run(),无返回值
  • 方式2:实现Runnable接口,重写run(),无返回值
  • 方式3:新建FutureTask + 实现Callable接口,重写call(),有返回值
  • 方式4:通过Executors工具类创建线程池 + 调用submit + 重写Callable接口,重写call(),有返回值

具体每一种创建方式说明及代码实现如下:



public class NewThread {

    public static void main(String[] args) throws Exception {

        //方式1
        Thread t1 = new Thread(){
            @Override
            public void run() {
                System.out.println("方式1:继承Thread类并重写run()方法创建线程,无返回值");
            }
        };
        t1.start();
        Thread.sleep(1000);

        //方式2
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("方式2:实现Runnable接口并重写run()方法创建线程,无返回值");
            }
        });
        t2.start();
        Thread.sleep(1000);

        //方式3
        FutureTask<String> ft = new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                String result = "方式3:实现Callable接口并重写call()方法新建FutureTask对象作为new Thread实例化参数创建线程,有返回值";
                return result;
            }
        });
        Thread t3 = new Thread(ft);
        t3.start();
        System.out.println(ft.get()); //输出返回值

        Thread.sleep(1000);

        //方式4
        ExecutorService pool = Executors.newFixedThreadPool(5);
        Future<String> future = pool.submit(new Callable<String>(){
            @Override
            public String call() throws Exception {
                String result = "方式4:通过工具类Executors创建线程池,调用submit新建Future对象并重写Callable接口重写call()方法创建线程,有返回值";
                return result;
            }
        });
        pool.shutdown();//关闭线程池
        System.out.println(future.get()); //输出返回值
    }
}

线程的几种状态?

  • 新建(new):通过上面介绍的某种方式新建线程即处于新建状态;
  • 就绪(Ready):调用线程的start()方法,首先进入就绪状态,等待获取CPU时间;
  • 运行(Running):就绪状态的线程获取到CPU时间或阻塞状态的线程恢复都可进入运行状态;
  • 阻塞(Blocked):运行状态的线程可能因为IO阻塞或在synchronized同步代码块中都可进入阻塞状态;
  • 死亡(Dead):正常运行的线程执行结束或就绪状态的线程直接调用stop()方法就会进入死亡状态;
  • 睡眠(Sleeping):调用sleep方法指定线程睡眠多久,会释放CPU资源,但不释放锁资源,睡眠时间到后会重新进入就绪状态;
  • 等待(Waiting):调用wait会让线程短暂的处于等待中,会释放CPU资源,并且释放锁资源,进入就绪状态。

在这里插入图片描述

线程相关的核心方法及作用?

  • start:调用start()方法底层源码会判断线程状态是否是新建状态,不是则直接抛异常,并且后续会调用一个native本地方法start0,其底层通过JVM来进行调度最后调用run()方法执行;
  • run:调用run()方法,底层会直接进入到重写的run()方法并执行代码块内容;
  • sleep:属于Thread类的一个native本地static静态方法,可以在任何地方调用sleep(1000)方法,期间会让当前线程进入睡眠状态1秒钟,并让出CPU资源,但不释放锁资源
  • wait:属于Object类的一个方法,只能在synchronized同步块中进行调用wait(1000)方法,期间会让当前线程进入等待状态1秒钟,不仅会让出CPU时间,还释放并释放对象锁资源
  • yield:跟sleep一样,也是Thread类的一个native本地static静态方法,与sleep的最大区别在于Thread.yield()不需要指定暂停时间,并不会阻塞线程,而是进入就绪状态,短暂的让出CPU资源,这份CPU资源可能自己会再次获取到,这个取决于调度器;
  • notify:同wait一样,也是属于Object类的一个方法,作用是可以将wait()后等待的线程进行单个唤醒,并进入Read就绪状态;
  • notifyAll:同notify一样,也是属于Object类的一个方法,作用将当前对象上的所有等待线程唤醒,并进入Read就绪状态;
  • stop:该方法已被废弃,不建议使用,该方法的作用是直接将线程结束,进入死亡状态;
  • interrupt:冲断线程,不保证线程进入死亡、就绪还是继续运行,不想stop可以直接冲断一个正在运行的线程。 What's up!不来个点赞支持一下,这手指是金子做的?

到此这篇关于Java线程的全方位详解的文章就介绍到这了,更多相关Java 线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java线程的全方位详解

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

下载Word文档

猜你喜欢

Java线程中的sleep方法详解

在Java线程中,sleep方法是一个线程的静态方法,用于暂停当前线程的执行一段时间。sleep方法的语法如下:```javapublic static void sleep(long millis) throws InterruptedE
2023-09-14

【Java系列】详解多线程(三)—— 线程安全(下篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评
【Java系列】详解多线程(三)—— 线程安全(下篇)
2023-12-22

Java中终止线程的方法详解

Java中终止线程的方式主要有三种:1、使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废
2023-05-31

Java线程安全与非线程安全解析

ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线
2023-05-31

Java线程同步的四种方式详解

这篇文章主要介绍了Java线程同步的四种方式详解,需要的朋友可以参考下
2023-02-18

java线程池详解

线程池概述1. 线程池就是一个管理线程的池子,可以降低创建和销毁线程带来的资源消耗因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。2. 提高响应速度,任务到达了相对于从线程池取线程,自己创建
java线程池详解
2015-04-06

详解Java的线程状态

本文主要为大家详细介绍一下Java的线程状态,文中的示例代码讲解详细,对我们学习有一定的帮助,感兴趣的小伙伴可以跟随小编学习一下
2022-11-13

详解SimpleDateFormat的线程安全问题与解决方案

1. 原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录