Java 多线程编程学习(二)
2016-05-03 12:55
405 查看
线程的介绍及使用多线程(传送门)
一、currentThread()方法
currentThread()方法可返回代码段正在被哪个线程调用的信息。
1.先贴测试一段代码
MyThread.java类的构造函数是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是自动调用的方法。但如果main方法中调用代码mythread.run(),则run方法由main线程调用。(详见多线程学习(一))
2.下面测试一个比较复杂的情况,创建测试用的Java文件CountOperate.java
3.多线程编程Thread.currentThread().getName()和this.getName()区别
由上面例子可以看出,类的构造方法由main线程调用,创建出名为Thread-0的线程,再由线程Thread-0创建出线程Thread-1和Thread-2,并将Thread-1的线程名称改为A(此时Thread-0的活动状态已经结束)。this.getName()之所以均输出线程名称为Thread-0,是因为JVM不知道线程执行到哪里了,只有使用Thread.
currentThread().getName()才能准确得到当前正在执行的线程名称
二、 isAlive()方法和sleep()方法
方法isAlive()的作用是测试线程是否处于活动状态。活动状态就是线程已经启动且尚未终止,而线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的。
方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠 (暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。
系统调用线程run方法运行开始与结束时间差为1000毫秒,在这两个时间线程都处于活动状态。而mian函数中的线程活动状态为false,因为c对象已经在2秒内执行完毕(包括沉睡1秒)
参考文献:
《Java多线程编程核心技术》
一、currentThread()方法
currentThread()方法可返回代码段正在被哪个线程调用的信息。
1.先贴测试一段代码
public class MyThread extends Thread { public MyThread(){ System.out.println("构造方法的打印:" + Thread.currentThread().getName()); } @Override public void run(){ System.out.println("run方法的打印:" + Thread.currentThread().getName()); } public static void main(String[] args) { MyThread mythread = new MyThread(); //此句为main线程调用构造函数 mythread.start(); //线程已准备就绪,等待系统调用mythread对象的run方法 //mythread.run(); //此句为main线程调用run方法 } }
MyThread.java类的构造函数是被main线程调用的,而run方法是被名称为Thread-0的线程调用的,run方法是自动调用的方法。但如果main方法中调用代码mythread.run(),则run方法由main线程调用。(详见多线程学习(一))
2.下面测试一个比较复杂的情况,创建测试用的Java文件CountOperate.java
public class CountOperate extends Thread { public CountOperate(){ System.out.println("CountOperate---begin"); System.out.println("Thread.currentThread().getName()=" + Thread.currentThread().getName()); System.out.println("this.getName()=" + this.getName()); System.out.println("CountOperate---end"); } @Override 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) { CountOperate c = new CountOperate(); Thread t1 = new Thread(c); Thread t2 = new Thread(c); t1.setName("A"); t1.start(); t2.start(); } }
//运行结果 CountOperate---begin Thread.currentThread().getName()=main this.getName()=Thread-0 CountOperate---end run---begin Thread.currentThread().getName()=A this.getName()=Thread-0 run---end
3.多线程编程Thread.currentThread().getName()和this.getName()区别
由上面例子可以看出,类的构造方法由main线程调用,创建出名为Thread-0的线程,再由线程Thread-0创建出线程Thread-1和Thread-2,并将Thread-1的线程名称改为A(此时Thread-0的活动状态已经结束)。this.getName()之所以均输出线程名称为Thread-0,是因为JVM不知道线程执行到哪里了,只有使用Thread.
currentThread().getName()才能准确得到当前正在执行的线程名称
二、 isAlive()方法和sleep()方法
方法isAlive()的作用是测试线程是否处于活动状态。活动状态就是线程已经启动且尚未终止,而线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的。
方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠 (暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。
public class MyThread extends Thread { @Override public void run(){ try{ System.out.println("begin Alive =" + Thread.currentThread().isAlive()); System.out.println("run threadName=" + Thread.currentThread().getName() + " begin =" + System.currentTimeMillis()); Thread.sleep(1000); System.out.println("end Alive =" + Thread.currentThread().isAlive()); System.out.println("run threadName=" + Thread.currentThread().getName() + " end =" + System.currentTimeMillis()); }catch(InterruptedException e){ e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException{ MyThread c = new MyThread(); c.start(); Thread.sleep(2000); System.out.println("c Alive =" + c.isAlive()); } }
//运行结果 begin Alive =true run threadName=Thread-0 begin=1462250706904 end Alive =true run threadName=Thread-0 end=1462250707905 c Alive =false
系统调用线程run方法运行开始与结束时间差为1000毫秒,在这两个时间线程都处于活动状态。而mian函数中的线程活动状态为false,因为c对象已经在2秒内执行完毕(包括沉睡1秒)
参考文献:
《Java多线程编程核心技术》
相关文章推荐
- java序列化问题
- java序列化
- JAVA多线程编程——JAVA内存模型
- Java IO
- macbook pro 配置jdk,maven环境变量
- java 各基本类型转 bytes 数组
- poj 1001 求高精度幂 -- java大法好
- Java final static abstract关键字概述
- java足迹
- Eclipse中添加web dynamic project
- 深入理解Java之线程池
- Java核心技术读书笔记
- MyBatis5中Spring集成MyBatis事物管理
- 关于Spring加载classpath与classpath*的过程剖析
- Java WEB安全问题及解决方案
- java:提示Could not initialize class sun.awt.X11GraphicsEnvironment
- SpringMVC配合EL表达式以及AJAX实现局部刷新
- Java自动重载Spring配置文件
- java生成指定范围的随机数
- java内存模型