关于线程的sleep方法:
static void sleep(Long mills)
1.静态方法:Thread.sleep(1000);
2.参数是毫秒
3.作用:让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其他线程使用。
这行代码出现在A线程中,A线程就会进入休眠
这行代码出现在B线程中,B线程就会进入休眠
4.Thread.sleep()方法,可以做到这种效果:
间隔特定的时间,去执行一段特定的代码,每隔多久执行一次。
public class ThreadTest06{
public static void main(String[] args){
//让当前线程进入休眠期,睡眠5秒
//当前线程是主线程
try{
Thread.sleep(1000*5);
}catch(InterruptedException e){
e.printStackTrace();
}
//5秒之后执行这里的代码
System.out.println("hello world");
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"-->"+i);
//睡眠一秒
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public class ThreadTest07{
public static void main(String[] args){
//创建线程对象
Thread t = new MyThread3();
t.setName("t");
t.start();
//调用sleep方法
try{
//问题:这行代码会让线程t进入休眠状态吗?
t.sleep(1000*5); //在执行的时候还是会转换成:Thread.sleep(1000*5);
//这行代码的作用是:让当前线程进入休眠,也就是说main线程进入休眠
//这行代码出现在main方法中,main线程睡眠。
}catch(InterruptesException e){
e.printStackTrace();
}
//5秒之后这里才会执行
System.out.println("hello world");
}
}
class MyThread3 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println(Thread.currentThread().getName()+"-->"+i);
}
}
}
sleep睡眠太久了,如果希望半道上醒来,应该怎么办?也就是说怎么叫醒一个正在睡眠的线程??
注意:这个不是中断线程,是终止线程的睡眠
public class ThreadTest08{
public class void main(String[] args){
Thread t = new Thread(new MyRunnable2());
t.setName("t);
t.start();
//希望5秒之后,t线程醒来(5秒之后主线程手里的活干完了)
try{
Thread.sleep(1000*5);
}catch(InteeruptedException e){
e.printStackTrace();
}
//终止t线程的睡眠(这种中断线程的方式依靠了java的异常处理机制)
t.interrupt(); //干扰,一盆冷水过去
}
}
class MyRunnable2 implements Runnable{
//重点:run()当中的异常不能throws,只能try catch
//因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多的异常。
public void run(){
System.out.println(Thread.currentThread().getName()+"-->begin");
try{
//睡眠1年
Thread.sleep(1000*60*60*24*365);
}catch(InterruptedException e){
e.printStackTrace();
}
//1年之后才会执行这里
System.out.println(Thread.currentThread().getName()+"-->end");
}
}