JavaEE初阶:Java线程的状态

这篇具有很好参考价值的文章主要介绍了JavaEE初阶:Java线程的状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

获取当前线程引用

休眠当前线程

 线程的状态

1.NEW              

2.TERMINATED 

3.RUNNABLE

4.WAITING

5.TIMED_WAITING

6.BLOCKED

多线程的意义

单线程

 多线程


获取当前线程引用

public static Thread currentThread(); 

这个方法返回当前线程的引用。但是我们会对static有疑惑,这其实是一个静态方法,更好的说法是这是一个类方法,调用这个方法,不需要实例,直接通过类名来调用。

可以直接通过Thread.currentThread(),不一定要t.currentThread()

在哪个线程中调用,就能获取到哪个线程的实例.

public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = Thread.currentThread();
        System.out.println(thread.getName());
   }
}

休眠当前线程

public static void sleep(long millis)

让线程休眠,本质上就是让这个线程不参与调度了,不去cpu上执行

JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 线程的状态

状态是针对当前的线程调度的情况来描述的
咱们现在认为,线程是调度的基本单位了 状态更应该是线程的属性。

在Java对于线程的状态,进行了细化:

1.NEW              

创建了Thread对象,但是还没调用start(内核里还没创建对应的PCB)

2.TERMINATED 

表示内核中的pcb已经执行完毕了,但是Thread对象还在

一但内核里的线程PCB消亡了,此时代码中t对象也就没啥用了,但是还存在

Java中的对象有生命周期,自有其规则,内核的线程释放的时候无法保证Java代码中t对象也立刻释放

因此势必就会存在内核的PCB没了,但是代码中的t还在这样的情况,此时就需要通过特定的状态,来把t对象标识成“无效”

3.RUNNABLE

a)正在CPU上执行的

b)在就绪队列里,随时可以去CPU上执行

4.WAITING

5.TIMED_WAITING

6.BLOCKED

JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 文章来源地址https://www.toymoban.com/news/detail-675937.html

通过getState可以获取当前进程的状态:​​​​​​​JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 此处能看到RUNNABLE,主要就是因为当前线程run里面,没有写任何sleep之类的方法。

多线程最核心的地方:抢占式执行,随机调度。

多线程的意义

我们写个案例来了解一下多线程的意义:

我们通过写一个运算量很大的任务,看一下多线程和单线程的区别

单线程

public class demo {
    public static void main(String[] args) {
        serial();
    }

    public static void serial(){
        long beg = System.currentTimeMillis();

        long a = 0;
        for(long i = 0 ; i < 100_0000_0000L ; i++){
            a++;
        }

        long b = 0;
        for(long j = 0 ; j < 100_0000_0000L ; j++){
            b++;
        }
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end-beg) + "ms");
    }
}

执行时间6599ms

进程已结束,退出代码0

通过运行一个重复一百亿的加法,可以得到这个线程的运行时间

用currentTimeMilis获取开始和结束的时间,打印出来两者之差,粗略的能得到运行的时间

JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 多线程

    public static void concurrency(){
        Thread t1 = new Thread(() -> {
            long a = 0;
            for(long i = 0 ; i < 100_0000_0000L ; i++){
                a++;
            }
        });

        Thread t2 = new Thread(() -> {
            long b = 0;
            for(long j = 0 ; j < 100_0000_0000L ; j++){
                b++;
            }
        });

        long beg = System.currentTimeMillis();
        t1.start();
        t2.start();
        long end = System.currentTimeMillis();
        System.out.println("执行时间" + (end-beg) + "ms");
        
    }

执行时间0ms

进程已结束,退出代码0

通过Lambda表达式新建两个线程,注意此时有main、t1、t2三个线程,我们把刚刚main线程的工作放在t1、t2中,这样在两个线程中分别进行循环

但是为什么最后的执行时间是0ms呢,是因为线程是独立运行的,执行时间的判定是在main线程中单独完成,也就是没有等待t1t2执行完再返回时间,所以我们需要加入join来让main线程等待其完成:

JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 JavaEE初阶:Java线程的状态,java,java-ee,开发语言

可以看到时间近乎缩短了一半,这就是多线程相对于单线程的优势,可以更加充分的利用CPU多核心的能力,但是时间又不是刚好缩短了一半:

JavaEE初阶:Java线程的状态,java,java-ee,开发语言

 

多线程,在这种CPU密集型的任务中有非常大的作用,可以充分利用CPU的多核资源,从而加快程序的运行效率。

但是不是说使用多线程,就能一定提高效率:

1.是否是多核(现在的CPU基本都是多核了)

2.当前核心是否空闲(如果CPU这些核心已经都满载了,这个时候启动更多的线程也啥用)
 

 

 

 

到了这里,关于JavaEE初阶:Java线程的状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java EE 初阶】文件操作

    目录 1.什么是文件? 1.在cmd中查看指定目录的树形结构语法 2.文件路径 从当前目录开始找到目标程序(一个点) 返回到上一级目录,再找目标程序(两个点) 2.Java中文件操作 1.File概述 1.属性 2. 构造方法 3.常用方法  代码展示: 4.常用方法2 3. 文件内容的读写---数据流 1.I

    2024年02月06日
    浏览(33)
  • 【Java EE初阶十三】网络初识

            网络发展的几个主要时期:         单机时代-局域网时代-广域网时代-移动互联网时代         随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成 业务,就有了网络互连。         网络互连: 将多台计

    2024年02月20日
    浏览(31)
  • 【Java EE初阶十六】网络原理(一)

            在网络原理中主要学习TCP/IP四层模型中的重点网络协议         应用层是和程序员接触最密切的;         应用程序:在应用层这里,很多时候都是程序员自定义应用层协议(步骤:1、根据需求,明确要传输的信息,2、约定好信息按照什么样的格式来组织)的

    2024年02月20日
    浏览(30)
  • 【Java EE初阶十七】网络原理(二)

    2.2.2 关于可靠传输 4.滑动窗口         前面的三个机制,都是在保证 tcp 的可靠性;         TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了);         滑动窗口,就让可靠传输对性能的影响,更少一些.TCP 只要引入了可

    2024年02月20日
    浏览(33)
  • 【Java EE 初阶】TCP协议的安全效率机制

    目录 1.应用层协议 2.传输层协议 3.UDP协议格式 4.TCP协议格式 5.TCP的安全效率机制 1.确认应答机制 2.超时重传机制 但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了; 3.连接管理机制 ​编辑 面试题:会不会有可能变成三次挥手? 面试题:第二个FIN丢包了如何处理?

    2024年02月09日
    浏览(31)
  • 【JavaEE基础学习打卡02】是时候了解Java EE了!

    📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所

    2024年02月12日
    浏览(33)
  • 【JavaEE基础学习打卡03】Java EE 平台有哪些内容?

    📜 本系列教程适用于Java Web初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所以

    2024年02月12日
    浏览(34)
  • 【Java EE初阶二十二】https的简单理解

             当前网络上,主要都是 HTTPS 了,很少能见到 HTTP.实际上 HTTPS 也是基于 HTTP.只不过 HTTPS 在 HTTP 的基础之上, 引入了\\\"加密\\\"机制;引入 HTTPS 防止你的数据被黑客篡改 ;         HTTPS 就是一个重要的保护措施.之所以能够安全, 最关键的在于\\\"加密”;         明文:

    2024年02月22日
    浏览(39)
  • 【Java EE初阶二十一】http的简单理解(二)

            Referer 描述了当前页面是从哪个页面跳转来的,如果是直接在地址栏输入 url(或者点击收藏夹中的按钮) 都是没有 Referer。如下图所示:         HTTP 最大的问题在于\\\"明文传输”,明文传输就容易被第三方获取并篡改.         HTTPS 针对 HTTP 数据进行了加密 (h

    2024年02月22日
    浏览(28)
  • 【Java EE初阶十五】网络编程TCP/IP协议(二)

            tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系         下面主要讲解两个关键的类:         1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号         2、Socket:即会给服务器使用,又会给客户端使用;         

    2024年02月20日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包