线程中的sleep方法
线程中的sleep方法
一、关于线程的sleep方法
static void sleep(long millis)
1.静态方法:Thread.sleep(1000)
2.单位是毫秒
3.作用:让当前线程进入休眠,进入“阻塞状态”,放弃占用cpu时间片,让给其他线程使用
出现在那个线程,哪个线程就休眠
4.Thread.sleep()可以实现,隔一段时间去执行一段特定的代码。每隔多久就执行一次
废话不多说,直接上代码:
首先先写个代码来简单看一下,线程的休眠
例如,我们想要实现一个简单的输出操作,但是让它在10秒之后再执行
public class ThreaTest06 {
public static void main(String[] args) {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"---->简单的打印");
}
}
输出:至于休眠效果可以自己试验一下,在这就不演示了!
main---->简单的打印
写个例子,让他可以一秒打印一个数字
public class ThreaTest06 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"------>"+i);
//当程序在循环中每执行一次输出,让它休眠一秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
输出:可以自己看一下是不是一秒打印一个数字
main------>0
main------>1
main------>2
main------>3
main------>4
main------>5
main------>6
main------>7
main------>8
main------>9
二、sleep让当前线程进入休眠
sleep并不是哪个线程调用就休眠哪个线程,要看sleep所在的位置
public class ThreadTest07 {
public static void main(String[] args) {
Thread t=new Thread07();
t.setName("t");
t.start();
//调用sleeo方法
try {
//t线程在此不会进入睡眠,因为sleep是一个静态的方法,
//刚才提到,sleep出现在哪里,就作用在哪里,现在是在主线程当中,主线程就休眠
t.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("5秒之后执行");
}
static class Thread07 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"------>"+i);
}
}
}
}
输出:在控制台中可以看到,t线程执行完之后,主线程休眠5秒,然会接着再执行输出操作!
t------>0
t------>1
t------>2
t------>3
t------>4
5秒之后执行
三、终止线程的休眠interrupt()
思考:如果一下线程休眠时间太长了,那么在中途怎么去唤醒这个线程
public class ThreadTest08 {
public static void main(String[] args) {
Thread t=new Thread(new Thread08());
t.setName("t");
t.start();
//我们希望在5秒之后,醒来中断线程的睡眠,interrupt()方法
try {
t.sleep(1000*5);
} catch (InterruptedException e) {
//打印异常信息
e.printStackTrace();
}
t.interrupt();//干扰
}
}
class Thread08 implements Runnable{
// run()方法当中的一场不能throws,只能try
//子类重写父类的方法时,子类不能比父类抛出更多的异常
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"----> begin");
try {
//睡一年
Thread.sleep(1000*60*60*24*365);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"----> end");
}
}
输出:
t----> begin
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.thread.Thread08.run(ThreadTest08.java:32)
at java.lang.Thread.run(Thread.java:748)
t----> end
当然我们在输出时也可不打印异常信息
把e.printStackTrace();注释一下,因为抛出异常是t线程中的,所以是注释下面的这个打印信息
看下输出结果:在睡眠之后打印end
t----> begin
t----> end
本文来自博客园,作者:星余明,转载请注明原文链接:https://www.cnblogs.com/lingstar/p/16534292.html