Java多线程:Thread中的静态方法

news/2024/10/19 6:28:02/

Thread类中的静态方法

Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:

1、currentThread()

currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:

public class MyThread04 extends Thread {static {System.out.println("静态块的打印:" +Thread.currentThread().getName());}public MyThread04() {System.out.println("构造方法的打印:" +Thread.currentThread().getName());}public void run() {System.out.println("run()方法的打印:" +Thread.currentThread().getName());}}public static void main(String[] args) {MyThread04 mt = new MyThread04();mt.start();}

看一下运行结果:

静态块的打印:main

构造方法的打印:main

run()方法的打印:Thread-0

这个例子说明了,线程类的构造方法、静态块是被main线程调用的,而线程类的run()方法才是应用线程自己调用的。在这个例子的基础上,再深入:

  public class MyThread05 extends Thread {public MyThread05() {System.out.println("MyThread5----->Begin");System.out.println("Thread.currentThread().getName()----->" + Thread.currentThread().getName());System.out.println("this.getName()----->" + this.getName());System.out.println("MyThread5----->end");}public void run() {System.out.println("run----->Begin");System.out.println("Thread.currentThread().getName()----->" + Thread.currentThread().getName());System.out.println("this.getName()----->" + this.getName());System.out.println("run----->end");}}public static void main(String[] args) {MyThread05 mt5 = new MyThread05();mt5.start();}

看一下运行结果:

MyThread5----->Begin

Thread.currentThread().getName()----->main

this.getName()----->Thread-0

MyThread5----->end

run----->Begin

Thread.currentThread().getName()----->Thread-0

this.getName()----->Thread-0

run----->end

上篇文章的开头就说过,要理解一个重要的概念,就是"this.XXX()"和"Thread.currentThread().XXX()"的区别,这个就是最好的例子。必须要清楚的一点就是:当前执行的Thread未必就是Thread本身。从这个例子就能看出来:

(1)执行MyThread05构造方法是main,当前线程却是Thread-0

(2)执行run()方法的Thread-0,当前线程也是Thread-0,说明run()方法就是被线程实例去执行的

所以,再强调一下,未必在MyThread05里调用Thread.currentThread()返回回来的线程对象的引用就是MyThread05

2、sleep(long millis)

sleep(long millis)方法的作用是在指定的毫秒内让当前"正在执行的线程"休眠(暂停执行)。这个"正在执行的线程"是关键,指的是Thread.currentThread()返回的线程。根据JDK API的说法,"该线程不丢失任何监视器的所属权",简单说就是sleep代码上下文如果被加锁了,锁依然在,但是CPU资源会让出给其他线程。看一下例子:

public class MyThread07 extends Thread {public void run() {try {System.out.println("run threadName = " +this.getName() + " begin");Thread.sleep(2000);System.out.println("run threadName = " +this.getName() + " end");} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {MyThread07 mt = new MyThread07();System.out.println("begin = " + System.currentTimeMillis());mt.start();System.out.println("end = " + System.currentTimeMillis());}

看一下运行结果:

begin = 1443694780609

end = 1443694780609

run threadName = Thread-0 begin

run threadName = Thread-0 end

当然,因为打印结果是静态的,所以只能看出异步执行的效果,看不出sleep(long millis)方法执行的效果。实际上第3句打出2秒后打出第4句,这和run()方法里面的sleep(2000)是对应的

3、yield()

暂停当前执行的线程对象,并执行其他线程。这个暂停是会放弃CPU资源的,并且放弃CPU的时间不确定,有可能刚放弃,就获得CPU资源了,也有可能放弃好一会儿,才会被CPU执行。看一下例子:

public class MyThread08 extends Thread {public void run() {long beginTime = System.currentTimeMillis();int count = 0;for (int i = 0; i < 50000000; i++) {Thread.yield();count = count + i + 1;}long endTime = System.currentTimeMillis();System.out.println("用时:" + (endTime - beginTime) + "毫秒!");}}public static void main(String[] args) {MyThread08 mt = new MyThread08();mt.start();}

看一下运行结果:

用时:3264毫秒!

用时:3299毫秒!

用时:3232毫秒!

用时:3256毫秒!

用时:3283毫秒!

用时:3504毫秒!

用时:3378毫秒!

看到,每次执行的用时都不一样,证明了yield()方法放弃CPU的时间并不确定。

4、interrupted()

测试当前线程是否已经中断,执行后具有将状态标识清除为false的功能。换句话说,如果连续两次调用该方法,那么返回的必定是false:

public static void main(String[] args){Thread.currentThread().interrupt();System.out.println("是否停止1?" + Thread.interrupted());System.out.println("是否停止2?" + Thread.interrupted());System.out.println("end!");}

当然,这也涉及Java的中断机制,留在后面的一篇文章专门讲解。


http://www.ppmy.cn/news/37689.html

相关文章

【前推回代法】含有分布式电源的三相不平衡配电网潮流计算【IEEE33节点】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维…

离线数据处理 任务一:数据抽取

数据准备 hive数据库和表的创建 任务 数据准备 准备数据文件 数据获取:https://download.csdn.net/download/dafsq/87635868?spm=1001.2014.3001.5501

LFM雷达及USRP验证【章节4:USRP环境仿真】

目录 1. USRP参数 1.1 收发机各项参数 1.2 结构框图 2. URSP仿真测试 2.1 USRP仿真参数设置 2.2 LFM参数设置 2.3 matlab仿真 实验仿真环境 USRP2944*1&#xff0c;matlab2021b&#xff0c;Labview2019&#xff0c;单LFM脉冲 1. USRP参数 1.1 收发机各项参数 参考USRP…

Mac node使用nvm进行版本管理

一、Homebrew自动安装 // Homebrew安装/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"// Homebrew卸载/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/HomebrewUninstall.sh)"输入…

一款全新的基于GPT4的Python神器,关键还免费

chartgpt大火之后&#xff0c;随之而来的就是一大类衍生物了。 然后&#xff0c;今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费&#xff0c;我们可以直接利用它来辅助我们编程&#xff0c;真正做到事半功倍。 注意&#…

jsp+servlet+java物流快递网站

本系统为用户提供强大的数据操纵功能&#xff0c;界面友好、使用简单方便&#xff0c;系统维护成本低。有鉴于简单操作和界面的可视化的优势。并借助于网络的优势。本系统采用JSP语言、Myeclipse开发工具&#xff0c;后端采用的是Mysql数据库来完成物流公司物流管理系统的设计与…

Android ART虚拟机 对象创建内存分配流程

前言 本篇文章介绍我们在日常开发使用Java时new对象的时&#xff0c;ART在堆上的内存分配是如何分配的。内存又和gc相关&#xff0c;下篇文章会分析ART的gc流程。本文可以参考之前写的Dalivk虚拟机下的对象创建时内存分配流程一起看&#xff0c;会对ART虚拟机理解的更深刻些。…

Geoserver 发布wmts服务,以及cesium加载发布的wmts服务

WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案。WMTS弥补了WMS不能提供分块地图的不足。WMS针对提供可定制地图的服务&#xff0c;是一个动态数据或用户定制地图&#xff08;需结合SLD标准&#xff09;的理想解决办法。WMTS牺牲了提供定制地图的灵活性&am…