Java线程的全方位详解

 更新时间:2021年10月09日 15:44:27   作者:吾日三省贾斯汀  
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销

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

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

在这里插入图片描述

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

什么是线程?

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

在这里插入图片描述

线程的几种创建方式?

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

在这里插入图片描述

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

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

/**
 * 创建Thread线程的四种方式之内部类写法
 */
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 线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA内存模型(JMM)详解

    JAVA内存模型(JMM)详解

    这篇文章主要介绍了JAVA内存模型(JMM)详解的相关资料,需要的朋友可以参考下
    2022-12-12
  • Java中ArrayList的使用详细介绍

    Java中ArrayList的使用详细介绍

    这篇文章主要介绍了Java中ArrayList的使用,本文给大家详细讲述该相关的知识点,并且会通过大量的案例加以说明,需要的朋友可以参考一下
    2022-04-04
  • java通过snmp协议获取物理设备信息

    java通过snmp协议获取物理设备信息

    这篇文章主要介绍了java通过snmp协议获取物理设备信息,snmp中文含义是简单网络管理协议,可用完成对计算机、路由器和其他网络设备的远程管理和监视,本文我们是通过java程序来获取,需要的朋友可以参考下
    2023-07-07
  • MyBatis3传递多个参数(Multiple Parameters)

    MyBatis3传递多个参数(Multiple Parameters)

    这篇文章主要介绍了MyBatis3传递多个参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

    利用JAVA反射,读取数据库表名,自动生成对应实体类的操作

    这篇文章主要介绍了利用JAVA反射,读取数据库表名,自动生成对应实体类的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java多线程三种主要实现方式解析

    Java多线程三种主要实现方式解析

    这篇文章主要介绍了Java多线程三种主要实现方式解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis关联映射举例详解

    Mybatis关联映射举例详解

    关联关系是面向对象分析、面向对象设计最终的思想,Mybatis完全可以理解这种关联关系,如果关系得当,Mybatis的关联映射将可以大大简化持久层数据的访问
    2022-07-07
  • 使用Eclipse开发工具如何解决Java Compiler中Annotation Processin不出现的问题

    使用Eclipse开发工具如何解决Java Compiler中Annotation Processin不出现的问题

    这篇文章主要介绍了使用Eclipse开发工具如何解决Java Compiler中Annotation Processin不出现的相关资料,需要的朋友可以参考下
    2015-11-11
  • Java Stream 流的使用过程解析

    Java Stream 流的使用过程解析

    这篇文章主要介绍了Java Stream 流的使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java修改PowerPoint幻灯片批注信息

    Java修改PowerPoint幻灯片批注信息

    这篇文章主要介绍了Java修改PowerPoint幻灯片批注信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论