线程基础2—sleep和join

一、sleep(毫秒数)方法

    1、sleep方法是一个静态方法。

<span style="font-family:KaiTi_GB2312;font-size:24px;">public class ThreadTest extends Thread{
    public static void main(String[] args){
    	  ThreadTest thread=new ThreadTest();
    	  thread.start();
    	  try {
			sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
          System.out.println("main线程被执行");
    }
    public void run(){
    	try {
			sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        System.out.println("ThreadTest线程被执行");
    }
}
</span>
输出结果:

ThreadTest线程被执行
main线程被执行

如果将sleep(10000)改为thread.sleep(10000)

public class ThreadTest extends Thread{
    public static void main(String[] args){
    	  ThreadTest thread=new ThreadTest();
    	  thread.start();
    	  try {
			thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
          System.out.println("main线程被执行");
    }
    public void run(){
    	try {
			sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        System.out.println("ThreadTest线程被执行");
    }
}

输出结果:

ThreadTest线程被执行
main线程被执行

由以上可以看出,thread.sleep方法并不是休眠thread线程,而是休眠main线程。


sleep方法的执行不是取决于哪个线程通过“.”调用,而是在哪个线程中声明,在main方法中声明sleep或Thread.sleep休眠的是main线程,其他线程对象一般在run()方法中调用其sleep使该线程休眠。

     2、线程进入休眠状态后,并没有释放所占用的CPU片段。sleep方法让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间。

    3、sleep方法需捕获InterruptedException异常。线程在sleep过程中有可能被其他对象调用它的interrupt()方法,产生InterruptedException异常,如果程序不捕获这个异常,线程就会异常终止,进入TERMINATED状态;如果程序捕获了这个异常,那么程序就会继续执catch语句块(可能还有finally语句块)以及以后的代码。

二、join()方法

   1、一个线程调用join()方法,当前正在执行的线程被阻塞,直至调用join方法的线程执行完毕,当前线程才能继续执行。

public class Test {
	 public static class Thread_A extends Thread{
		 public void run(){
			try {
			        sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("A线程执行...");
		 }
	 }
     public static void main(String[] args){
    	    Thread_A a=new Thread_A();
            a.start();
    		try {
			a.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
       	 System.out.println("main线程执行...");
     }
}
运行结果:
A线程执行...
main线程执行...

   2、调用join()方法时可以带一个参数( join(long millis) join(long millis, int nanos) ),目标线程在时间到期时,即使没有结束,join() 方法也返回,被挂起的线程恢复执行

   3、对join()方法的调用可以被中断,做法是在调用线程上调用interrupt()方法,注意异常处理。


       






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值