概述
线程的生命周期:
- 新建状态:刚new出来的状态,此时还不能抢夺时间片。
- 就绪状态:调用start方法进入就绪状态。又 叫做可运行状态。 具有抢夺CPU时间片的权利 。
- 运行状态:当一个线程抢到CPU时间片后,进入运行状态。开始执行run方法。
- 死亡状态:run方法的结束标志着进入死亡。
- 阻塞状态:当一个线程遇到阻塞事件,此时线程会进入阻塞状态,阻塞状态的线程会放弃之前占有的时间片,当阻塞状态结束后又去抢夺时间片继续执行。
大家可以参考如下图片:
线程的几个方法
- 获取当前线程名字
Thread thread = Thread.currentThread();
System.out.println(thread.getName());//main
Thread myThread = new MyThread();
System.out.println(myThread.getName());//Thread-0
Thread myThread2 = new MyThread();
System.out.println(myThread2.getName());//Thread-1
currentThread()这个方法是静态方法,因为这个方法在main方法中进行所以得到的是主线程的名字。
- 静态方法 Thread.sleep(long millis) 作用是让当前线程进入休眠,进入阻塞状态,放弃占有CPU时间片,让给其它线程。
Thread.sleep(5 * 1000);
System.out.println("helloworld");
五秒后输出helloworld
面试题
sleep()是一个静态的方法,用对象去调用这个方法,相当于是用类名调用
即 t.sleep(10005)等价于Thread.sleap(10005)
可能有的人用堆栈的方法去分析结果是一样的,但这样的分析是不对的。
3、sleep睡眠太久,如果希望它马上醒来用什么方法呢?interrupt() 方法
public class MyThread extends Thread{
@Override
public void run() {
Thread thread = Thread.currentThread();
try {
thread.sleep(1000*3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end the sleep");
}
}
Thread myThread = new MyThread();
Thread threadMain = Thread.currentThread();
myThread.start();
threadMain.sleep(3000);
myThread.interrupt();
在控制台上会出现如下的信息
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.bjpowernode.ThreadTest.MyThread.run(MyThread.java:14)
end the sleep
run方法中信息还是输出来了,这种中断睡眠的方式靠的是异常的处理机制,interrupt() 这个方法只是打断了sleep(), 而没有中断run()方法的执行。这一点必须要清楚。
- 如何强行终止睡眠? stop()方法
Thread myThread = new MyThread();
Thread threadMain = Thread.currentThread();
myThread.start();
threadMain.sleep(3000);
myThread.stop();
@Override
public void run() {
Thread thread = Thread.currentThread();
try {
for (int i=0;i<=10;i++){
thread.sleep(1000);
System.out.println(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end the sleep");
}
输出结果:0 1
stop()这个方法已经过期了,一般不用这个方法,因为这个方法会杀死线程,导致数据的丢失。
- 如何合理终止一个线程,用打标记的方式
public class MyRunnable implements Runnable {
boolean flag = true;
@Override
public void run() {
// if (flag) {
// for (int i = 0; i < 100; i++) {
// try {
// Thread.sleep(1000);
// System.out.println(i);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// }else {
// return;
// }
for (int i=0;i<10;i++){
if (flag){
try {
Thread.sleep(1000);
System.out.println(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
return;
}
}
}
}
public class Test {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread myrt = new Thread(myRunnable);
myrt.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myRunnable.flag = false;
}
}
大家如果感兴趣的话可以测测我注释的代码,会发现控制不了(我也不知道为什么,如果知道的可以评论留言,谢谢)
最后
以上就是失眠朋友为你收集整理的多线程二:线程生命周期及sleep()方法和终止睡眠的三种方法的全部内容,希望文章能够帮你解决多线程二:线程生命周期及sleep()方法和终止睡眠的三种方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复