Java多线程3:Thread中的静态方法
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的中断机制,留在后面的一篇文章专门讲解。
Java多线程3:Thread中的静态方法的更多相关文章
- java 多线程 2 Thread中start()和run()的区别
- Java多线程4:Thread中的静态方法
一.Thread类中的静态方法 Thread类中的静态方法是通过Thread.方法名来调用的,那么问题来了,这个Thread指的是哪个Thread,是所在位置对应的那个Thread嘛?通过下面的例子可 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- JAVA多线程(一) Thread & Runnable
githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- java多线程创建-Thread,Runnable,callable和threadpool
java创建多线程的方式有许多种,这里简要做个梳理 1. 继承Thread类 继承java.lang.Thread类,创建本地多线程的类,重载run()方法,调用Thread的方法启动线程.示例代码如 ...
- Java 多线程(1)-Thread和Runnable
一提到Java多线程,首先想到的是Thread继承和Runnable的接口实现 Thread继承 public class MyThread extends Thread { public void ...
- Java 多线程 (Thread 类)
1.多线程 2.卖票 1.多线程实现 两种方式可以实现多线程: 继承 Thread 类,重写 run 方法:定义对象,调用 start 方法 创建类实现 Runnable 接口,作为实参传递给 thr ...
- Java 多线程之 Thread 类 和 Runnable 接口初步使用
目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ...
- Java 多线程查找文件中的内容
学过了操作系统,突然不知道多线程有什么用了. 看了一下百度,发现多线程,可以提升系统利用率 在系统进行IO操作的时候,CPU可以处理一些其他的东西,等IO读取到内存后,CPU再处理之前的操作. 总之可 ...
随机推荐
- U盘启动盘 安装双系统 详细教程
U盘启动盘 安装win7+linux双系统 最近在看鸟哥的linux 私房菜 ,看到多重系统那部分,自然的安装多重系统的激情由此而燃.在网上看了很多资料,感觉都不全.经过艰辛的摸索,终于被我发现了一个 ...
- Http协议与TCP协议简单理解(转)
在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解.TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上 ...
- sql server convert 日期
),) --2016/11 ),) --2016-11-03 17:46:47
- window常用命令
netstat -ano|findstr "端口号" :查看指定端口信息[netstat -ano|findstr "端口号" ] ,然后看下PID号 ...
- MMS搜索功能修改
高通平台的MMS源码中提供了搜索功能,但要先选择分类(名字,号码,信息内容,彩信主题),再输入字符,根据分类进行搜索. 而在Contacts中却不需要分类,直接根据输入字符搜索任意匹配字段.相比之下, ...
- window下flask开发环境搭建
1.安装python 官网下载https://www.python.org/downloads/,按提示安装就行,记住安装目录,把它添加到系统path中. 2.安装pip 官网下载pip文件:http ...
- Microsoft.Office.Interop.Word.Document.Open returns null on Windows Server 2008 R2
系统终于通过UAT,可以上线了.一遍测下来还行,可是为什么word转PDF就是不行呢?查了一下log,原来在wordApp.Documents.Open来打开生产的word文件的时候,返回一直是空.之 ...
- Android中如何查看so崩溃的log
两种方法: 一.android自带的arm-eabi-addr2line工具 例如, - :: I DEBUG : # pc 0000d766 /system/lib/libtest.so - :: ...
- 深入理解HTTP协议
- js基础知识点总结
如何在一个网站或者一个页面,去书写你的js代码:1.js的分层(功能):jquery(tool) 组件(ui) 应用(app),mvc(backboneJs)2.js的规划():避免全局变量和方法(命 ...