博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程3:Thread中的静态方法
阅读量:4322 次
发布时间:2019-06-06

本文共 4242 字,大约阅读时间需要 14 分钟。

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构造方法的打印:mainrun()方法的打印: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----->BeginThread.currentThread().getName()----->mainthis.getName()----->Thread-0MyThread5----->endrun----->BeginThread.currentThread().getName()----->Thread-0this.getName()----->Thread-0run----->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 = 1443694780609end = 1443694780609run threadName = Thread-0 beginrun 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的中断机制,留在后面的一篇文章专门讲解。

转载于:https://www.cnblogs.com/xiaojiesir/p/10983624.html

你可能感兴趣的文章
深入浅出 Java Concurrency (16): 并发容器 part 1 ConcurrentMap (1)[转]
查看>>
深入浅出 Java Concurrency (23): 并发容器 part 8 可阻塞的BlockingQueue (3)[转]
查看>>
将博客搬至CSDN
查看>>
HDOJ 2081
查看>>
第一节:认识电脑
查看>>
如何摆脱穷打工的命?
查看>>
iOS应用国际化教程
查看>>
MySql cmd下的学习笔记 —— 有关视图的操作(algorithm)
查看>>
gulp教程
查看>>
MySQL常用日期的选择
查看>>
Ubuntu下查看命令的源码
查看>>
锁及锁粒度的详细比喻
查看>>
JS获取终端屏幕、浏览窗口的相关信息
查看>>
长这么漂亮为啥还学编程?什么心态?
查看>>
JQ JS 切换背景图
查看>>
C#WebBrowser控件使用教程与技巧收集
查看>>
Git 命令
查看>>
/x00
查看>>
数据加载中……显示框
查看>>
判断Http请求由手机端发起,还是有电脑端发起
查看>>