iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java线程的全方位详解
  • 615
分享到

Java线程的全方位详解

2024-04-02 19:04:59 615人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是线程?线程的几种创建方式?线程的几种状态?线程相关的核心方法及作用?❤️‍大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!d

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

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

在这里插入图片描述

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

什么是线程?

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

在这里插入图片描述

线程的几种创建方式?

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

在这里插入图片描述

  • 方式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 线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java线程的全方位详解

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

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

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

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

下载Word文档
猜你喜欢
  • Java线程的全方位详解
    目录什么是线程?线程的几种创建方式?线程的几种状态?线程相关的核心方法及作用?❤️‍大家好,我是贾斯汀,今天主要聊一聊关于线程的瓜!d...
    99+
    2024-04-02
  • 一文精通Java 多线程之全方位解读
    目录并行和并发线程基础概念线程和进程多线程的好处线程的状态实现多线程的两种方式继承Thread类实现Runnable接口线程的安全性和原子性锁的概念和使用生产消费者模型生产消费者模型...
    99+
    2024-04-02
  • Java多线程之线程安全问题详解
    目录1. 什么是线程安全和线程不安全?2. 自增运算为什么不是线程安全的?3. 临界区资源和竞态条件总结:面试题: 什么是线程安全和线程不安全?自增运算是不是线程安全的?如何保证多线...
    99+
    2024-04-02
  • java多线程创建及线程安全详解
    什么是线程 线程被称为轻量级进程,是程序执行的最小单位,它是指在程序执行过程中,能够执行代码的一个执行单位。每个程序程序都至少有一个线程,也即是程序本身。 线程...
    99+
    2024-04-02
  • Java线程中的sleep方法详解
    在Java线程中,sleep方法是一个线程的静态方法,用于暂停当前线程的执行一段时间。sleep方法的语法如下:```javapub...
    99+
    2023-09-14
    Java
  • 【Java系列】详解多线程(三)—— 线程安全(下篇)
    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评...
    99+
    2023-12-22
    java 安全 多线程 java-ee
  • Java 线程池全面总结与详解
    目录原理阻塞队列有界阻塞队列无界阻塞队列同步移交队列实现类分析使用Executors创建线程池线程池关闭线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池。...
    99+
    2024-04-02
  • Java使用线程同步解决线程安全问题详解
    第一种方法:同步代码块: 作用:把出现线程安全的核心代码上锁 原理:每次只能一个线程进入,执行完毕后自行解锁,其他线程才能进来执行 锁对象要求:理论上,锁对象只要对于当前同时执行的线...
    99+
    2024-04-02
  • 一文详解Java线程中的安全策略
    目录一、不可变对象二、线程封闭三、线程不安全类与写法四、线程安全-同步容器1. ArrayList -> Vector, Stack2. HashMap -> HashT...
    99+
    2024-04-02
  • Java中终止线程的方法详解
    Java中终止线程的方式主要有三种:使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。...
    99+
    2023-05-31
    java 终止线程 ava
  • Java线程安全问题的解决方案
    目录线程安全问题演示解决线程安全问题1.原子类AtomicInteger2.加锁排队执行2.1 同步锁synchronized2.2 可重入锁ReentrantLock3.线程本地变...
    99+
    2024-04-02
  • Java中线程状态+线程安全问题+synchronized的用法详解
    目录java中的线程状态线程安全问题案例分析多线程对同一变量进行写操作内存可见性问题指令重排序问题synchronized的用法synchronized起作用的本质修饰普通方法修饰静...
    99+
    2024-04-02
  • 关于java中线程安全问题详解
    目录一、什么时候数据在多线程并发的环境下会存在安全问题?二、怎么解决线程安全问题?三、银行 取钱/存钱 案例为什么会出现线程安全问题四、总结 一、什么时候数据在多线程并发的环境下会存...
    99+
    2024-04-02
  • C# 线程安全详解
    目录介绍经典生产消费问题介绍QueueConcurrentQueueBlockingCollectionBlockingCollection 枚举BlockingCollection...
    99+
    2024-04-02
  • Java线程安全与非线程安全解析
    ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别?这些都是Java面试中常见的基础问题。面对这样的问题,回答是:ArrayList是非线...
    99+
    2023-05-31
    java 线程安全 ava
  • Java多线程之线程安全问题详情
    目录1.线程安全概述1.1什么是线程安全问题1.2一个存在线程安全问题的程序2.线程加锁与线程不安全的原因2.1案例分析2.2线程加锁2.2.1什么是加锁2.2.2如何加锁2.2.3...
    99+
    2024-04-02
  • 详解Java停止线程的四种方法
    一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态...
    99+
    2024-04-02
  • Java线程同步的四种方式详解
    Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式 什么是Java线程同步 当使用多个线程来访问同一个数据时,将会...
    99+
    2023-02-18
    Java 线程同步 Java线程同步的四种方式 Java使用synchronized关键字线程同步 Java使用ReentrantLock线程同步 Java使用原子变量实现线程同步 JavaThrea
  • 详解SimpleDateFormat的线程安全问题与解决方案
    1. 原因SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日...
    99+
    2023-05-31
    simpledateformat 线程 dat
  • 详解Java的线程状态
    Java的每个线程都具有自己的状态,Thread类中成员变量threadStatus存储了线程的状态: private volatile int threadStatus = 0; ...
    99+
    2022-11-13
    Java线程状态 Java线程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作