Thread类中的静态方法

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

1、currentThread()

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

  1. public class MyThread04 extends Thread
  2. {
  3. static
  4. {
  5. System.out.println("静态块的打印:" +
  6. Thread.currentThread().getName());
  7. }
  8.  
  9. public MyThread04()
  10. {
  11. System.out.println("构造方法的打印:" +
  12. Thread.currentThread().getName());
  13. }
  14.  
  15. public void run()
  16. {
  17. System.out.println("run()方法的打印:" +
  18. Thread.currentThread().getName());
  19. }
  20. }
  1. public static void main(String[] args)
  2. {
  3. MyThread04 mt = new MyThread04();
  4. mt.start();
  5. }

看一下运行结果:

  1. 静态块的打印:main
  2. 构造方法的打印:main
  3. run()方法的打印:Thread-0

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

  1. public class MyThread05 extends Thread
  2. {
  3. public MyThread05()
  4. {
  5. System.out.println("MyThread5----->Begin");
  6. System.out.println("Thread.currentThread().getName()----->" +
  7. Thread.currentThread().getName());
  8. System.out.println("this.getName()----->" + this.getName());
  9. System.out.println("MyThread5----->end");
  10. }
  11.  
  12. public void run()
  13. {
  14. System.out.println("run----->Begin");
  15. System.out.println("Thread.currentThread().getName()----->" +
  16. Thread.currentThread().getName());
  17. System.out.println("this.getName()----->" + this.getName());
  18. System.out.println("run----->end");
  19. }
  20. }
  1. public static void main(String[] args)
  2. {
  3. MyThread05 mt5 = new MyThread05();
  4. mt5.start();
  5. }

看一下运行结果:

  1. MyThread5----->Begin
  2. Thread.currentThread().getName()----->main
  3. this.getName()----->Thread-0
  4. MyThread5----->end
  5. run----->Begin
  6. Thread.currentThread().getName()----->Thread-0
  7. this.getName()----->Thread-0
  8. 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资源会让出给其他线程。看一下例子:

  1. public class MyThread07 extends Thread
  2. {
  3. public void run()
  4. {
  5. try
  6. {
  7. System.out.println("run threadName = " +
  8. this.getName() + " begin");
  9. Thread.sleep(2000);
  10. System.out.println("run threadName = " +
  11. this.getName() + " end");
  12. }
  13. catch (InterruptedException e)
  14. {
  15. e.printStackTrace();
  16. }
  17. }
  18. }
  1. public static void main(String[] args)
  2. {
  3. MyThread07 mt = new MyThread07();
  4. System.out.println("begin = " + System.currentTimeMillis());
  5. mt.start();
  6. System.out.println("end = " + System.currentTimeMillis());
  7. }

看一下运行结果:

  1. begin = 1443694780609
  2. end = 1443694780609
  3. run threadName = Thread-0 begin
  4. run threadName = Thread-0 end

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

3、yield()

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

  1. public class MyThread08 extends Thread
  2. {
  3. public void run()
  4. {
  5. long beginTime = System.currentTimeMillis();
  6. int count = 0;
  7. for (int i = 0; i < 50000000; i++)
  8. {
  9. Thread.yield();
  10. count = count + i + 1;
  11. }
  12. long endTime = System.currentTimeMillis();
  13. System.out.println("用时:" + (endTime - beginTime) + "毫秒!");
  14. }
  15. }
  1. public static void main(String[] args)
  2. {
  3. MyThread08 mt = new MyThread08();
  4. mt.start();
  5. }

看一下运行结果:

  1. 用时:3264毫秒!
  2. 用时:3299毫秒!
  3. 用时:3232毫秒!
  4. 用时:3256毫秒!
  5. 用时:3283毫秒!
  6. 用时:3504毫秒!
  7. 用时:3378毫秒!

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

4、interrupted()

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

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

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

Java多线程3:Thread中的静态方法的更多相关文章

  1. java 多线程 2 Thread中start()和run()的区别

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

    一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...

  3. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  4. JAVA多线程(一) Thread & Runnable

    githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...

  5. java多线程创建-Thread,Runnable,callable和threadpool

    java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...

  6. Java 多线程(1)-Thread和Runnable

    一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...

  7. Java 多线程 (Thread 类)

    1.多线程 2.卖票 1.多线程实现 两种方式可以实现多线程: 继承 Thread 类,重写 run 方法:定义对象,调用 start 方法 创建类实现 Runnable 接口,作为实参传递给 thr ...

  8. Java 多线程之 Thread 类 和 Runnable 接口初步使用

    目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...

  9. Java 多线程查找文件中的内容

    学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...

随机推荐

  1. U盘启动盘 安装双系统 详细教程

    U盘启动盘 安装win7+linux双系统 最近在看鸟哥的linux 私房菜 ,看到多重系统那部分,自然的安装多重系统的激情由此而燃.在网上看了很多资料,感觉都不全.经过艰辛的摸索,终于被我发现了一个 ...

  2. Http协议与TCP协议简单理解(转)

    在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...

  3. sql server convert 日期

    ),) --2016/11 ),) --2016-11-03 17:46:47

  4. window常用命令

    netstat -ano|findstr "端口号"     :查看指定端口信息[netstat -ano|findstr "端口号" ] ,然后看下PID号 ...

  5. MMS搜索功能修改

    高通平台的MMS源码中提供了搜索功能,但要先选择分类(名字,号码,信息内容,彩信主题),再输入字符,根据分类进行搜索. 而在Contacts中却不需要分类,直接根据输入字符搜索任意匹配字段.相比之下, ...

  6. window下flask开发环境搭建

    1.安装python 官网下载https://www.python.org/downloads/,按提示安装就行,记住安装目录,把它添加到系统path中. 2.安装pip 官网下载pip文件:http ...

  7. Microsoft.Office.Interop.Word.Document.Open returns null on Windows Server 2008 R2

    系统终于通过UAT,可以上线了.一遍测下来还行,可是为什么word转PDF就是不行呢?查了一下log,原来在wordApp.Documents.Open来打开生产的word文件的时候,返回一直是空.之 ...

  8. Android中如何查看so崩溃的log

    两种方法: 一.android自带的arm-eabi-addr2line工具 例如, - :: I DEBUG : # pc 0000d766 /system/lib/libtest.so - :: ...

  9. 深入理解HTTP协议

  10. js基础知识点总结

    如何在一个网站或者一个页面,去书写你的js代码:1.js的分层(功能):jquery(tool) 组件(ui) 应用(app),mvc(backboneJs)2.js的规划():避免全局变量和方法(命 ...