currentThread()

currentThread() 方法用来返回代码段正在被哪个线程调用,它是 Thread 类提供的一个 native 方法,返回一个 Thread 类的实例对象,源码如下:

public static native Thread currentThread();

废话就不多说了,直接上代码:

public class Run {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();// 第二个参数为线程的名字Thread thread = new Thread(myRunnable, "Thread-itming");thread.start();}
}class MyRunnable implements Runnable {public MyRunnable() {System.out.println("调用构造方法的线程:" + Thread.currentThread().getName());}@Overridepublic void run() {System.out.println("调用 run() 方法的线程:" + Thread.currentThread().getName());}
}

控制台输出如下:

调用构造方法的线程:main
调用 run() 方法的线程:Thread-itming

从输出结果可以看到,调用构造方法的线程是 main 线程,即主线程,调用 run() 方法的线程是新创建的线程 Thread-itming。

在调用 start() 方法之前,所有的代码都是由主线程调用执行的,而在调用 start() 方法之后才会开启一个新的线程,并执行 run() 方法。

这里我们可以思考一个问题,调用 run() 方法和 start() 方法的区别是什么?

  • 调用 run() 方法:不启动新线程,立即执行 run() 方法。
  • 调用 start() 方法:启动新的线程,然后由新线程调用 run() 方法。

为了验证这一点,我对上面的代码做了一些小调整,代码如下:

public class Run {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();// 第二个参数为线程的名字Thread thread = new Thread(myRunnable, "Thread-itming");// thread.start();thread.run();}
}class MyRunnable implements Runnable {public MyRunnable() {System.out.println("调用构造方法的线程:" + Thread.currentThread().getName());}@Overridepublic void run() {System.out.println("调用 run() 方法的线程:" + Thread.currentThread().getName());}
}

控制台输出如下:

调用构造方法的线程:main
调用 run() 方法的线程:main

从输出结果可以看到,调用构造方法和 run() 方法的线程都是 main 线程,由此可以证明直接调用 run() 方法不会启动新线程,需要调用 start() 方法才会启动新的线程。

isAlive()

isAlive() 方法用来判断当前线程是否处于存活状态,存活状态指的是线程已经启动且尚未终止的状态。

下面我们来写一个案例进行测试,代码如下:

public class Run {public static void main(String[] args) throws InterruptedException {MyThread myThread = new MyThread();System.out.println("begin = " + myThread.isAlive());myThread.start();System.out.println("end = " + myThread.isAlive());}
}class MyThread extends Thread {@Overridepublic void run() {System.out.println("run = " + this.isAlive());}
}

控制台输出如下:

begin = false
end = true
run = true

这里我们需要注意一点,对于代码:

System.out.println("end = " + myThread.isAlive());

其输出值是不确定的(虽然不确定,但大概率返回 true),输出 true 或 false 取决于执行该行代码时 myThread 线程是否执行完毕,未执行完毕的话就返回 false,执行完毕的话就返回 true。

我们可以代码进行一些修改,让该行代码大概率输出 false,代码如下:

package t004;public class Run {public static void main(String[] args) throws InterruptedException {MyThread myThread = new MyThread();System.out.println("begin = " + myThread.isAlive());myThread.start();/*** 让当前线程休眠 1000 毫秒,这里的当前线程指的是 main 线程* 在这 1000 毫秒内,myThread 线程大概率已经执行完毕*/Thread.sleep(1000);System.out.println("end = " + myThread.isAlive());}
}class MyThread extends Thread {@Overridepublic void run() {System.out.println("run = " + this.isAlive());}
}

控制台输出如下:

begin = false
run = true
end = false

sleep()

sleep() 方法可以让当前线程进入超时等待状态(TIME_WAITING),并在指定时间后恢复到运行状态(RUNNABLE)。它有两个重载的方法,部分源码如下:

public static native void sleep(long millis) throws InterruptedExceptionpublic static void sleep(long millis, int nanos) throws InterruptedException

sleep(long millis):参数 millis 的单位是毫秒。

sleep(long millis, int nanos):参数 millis 的单位是毫秒,参数 nanos 的单位是纳秒,线程等待的时间是两个参数的和。

getId()

getId() 方法用于获取线程的唯一标识。

下面通过一个示例进行说明,代码如下:

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

控制台输出如下:

main 1

yield()

yield() 方法的作用是让当前线程释放 CPU 资源,并且当前线程会从运行中状态变为就绪状态(在 Java 中,运行中状态和就绪状态都属于运行状态),然后等待系统调度。

举个例子:有一群小朋友排队等待荡秋千,此时正在荡秋千的甲忽然说我愿意让出秋千,然后我们再一起竞争。最后的结果可能是其他小朋友获得了荡秋千的机会,也可能依然是甲获得了荡秋千的机会。

下面我们来编写一段代码,测试一下 yield() 方法的使用效果,代码如下:

public class Run {public static void main(String[] args) {Thread thread = new Thread() {@Overridepublic void run() {long beginTime = System.currentTimeMillis();long count = 0;for (int i = 0; i < 100000000; i++) {// Thread.yield();count = count + i;}long endTime = System.currentTimeMillis();System.out.println("耗时 " + (endTime - beginTime) + " 毫秒");}};thread.start();}
}

控制台输出如下:

耗时 29 毫秒

然后我们去掉注释,再次运行,控制台输出如下:

耗时 11008 毫秒

我们可以看到去掉注释前后这段代码运行所耗费的时间差距是非常大的,这是因为去掉注释后每一次 for 循环当前线程都会释放所占用的 CPU 资源,然后等待系统的重新调度,所以耗费的时间比较长。

Thread 类部分常用方法详解相关推荐

  1. 普歌-码灵团队-System类,StringBuilder类的常用方法详解

    System类,StringBuilder类的常用方法详解(java基础必掌握)java面试必问) System类的介绍: System类中常用方法: 1.System.currentTimeMill ...

  2. python:threading.Thread类的使用详解

    参考: https://blog.csdn.net/drdairen/article/details/60962439 http://www.cnblogs.com/429512065qhq/p/87 ...

  3. Java Thread类源码详解

    概述 Java所有多线程的实现,均通过封装Thread类实现,所以深入Thread类,对深入理解java多线程很有必要 构造函数: Thread的构造函数,采用缺省的方式实现: //传入Runnabl ...

  4. Python多线程编程(一):threading 模块 Thread 类的用法详解

    我们进行程序开发的时候,肯定避免不了要处理并发的情况. 一般并发的手段有采用多进程和多线程. 但线程比进程更轻量化,系统开销一般也更低,所以大家更倾向于用多线程的方式处理并发的情况. Python 提 ...

  5. c++string类的常用方法详解

    1 #include<iostream>2 #include<string>3 using namespace std;4 5 int main()6 {7 string st ...

  6. Arrays类常用方法详解

    Java-Arrays类常用方法详解 一.Arrays类的定义 Arrays类位于 java.util 包中,主要包含了操纵数组的各种方法二.Arrays类的常用方法 1.Arrays.asList( ...

  7. 1.8 Collections类操作集合详解——排序,查找,复制

    Collections类操作集合详解 Collections 类是 Java 提供的一个操作 Set.List 和 Map 等集合的工具类. Collections 类提供了许多操作集合的静态方法,借 ...

  8. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  9. Spark SQL原理及常用方法详解(二)

    Spark SQL 一.Spark SQL基础知识 1.Spark SQL简介 (1)简单介绍 (2)Datasets & DataFrames (3)Spark SQL架构 (4)Spark ...

最新文章

  1. 独家 | 使用深度神经网络在Oculus Quest上进行准确的手部追踪
  2. redmine2.4.2 插件安装
  3. zabbix JMX监控Tomcat及错误解决方法
  4. ASP.NET MVC 重点教程一周年版 第七回 UrlHelper 【转】
  5. SCCM2007 R2的部署前准备,SCCM系列之一
  6. Remoting: Server encountered an internal error
  7. 义教志愿服务系统c语言,招募义教志愿者策划书范本
  8. kl距离 java_相对熵(relative entropy或 Kullback-Leibler divergence,KL距离)的java实现(三)...
  9. linux版本的caj,同方知网文献阅读器CAJViewer for Linux版本安装说明
  10. 层次分析法原理和matlab代码
  11. C++编程常见问题—error: passing ‘const std::map<>]‘ discards qualifiers
  12. 什么是广域网(WAN)?
  13. diskgenius克隆硬盘无法启动_用Diskgenius克隆分区到另一个磁盘上
  14. Arduino实训-可移动机械臂(智能小车)
  15. Typecho炫彩鼠标插件:HoerMouse
  16. 深圳盛世光影简述影视后期制作包括哪些工作?
  17. 国家标准《信息技术 人工智能 知识图谱技术框架》第三次编辑会成功召开
  18. 3.2 实战项目二(手工分析错误、错误标签及其修正、快速地构建一个简单的系统(快速原型模型)、训练集与验证集-来源不一致的情况(异源问题)、迁移学习、多任务学习、端到端学习)
  19. 微信小程序自动连接蓝牙电子秤
  20. 兼容性事件监听完美封装addEvent

热门文章

  1. 实现类似王者荣耀的战令功能
  2. 计算机取消uefi启动项,UEFI安全启动怎么关闭 关闭UEFI启动项的方法图解
  3. 结构型模式——适配器模式(Adapter)
  4. 计算机桌面太暗了怎么调亮,笔记本屏幕暗,详细教您笔记本屏幕暗怎么调亮
  5. 中国绿化苗木市场需求动态与盈利前景预测报告(新版)2022-2027年
  6. 熬夜两天盘点2022年Java岗面试被问得最多的100道题
  7. count()函数的详解
  8. SIP协议 基本流程 及 抓包数据
  9. 如何使用XGBoost进行时间序列预测
  10. 随机生成6位数、随机生成不重复的6位数