线程基础2—sleep和join

来源:互联网 发布:技术研究工程师 知乎 编辑:程序博客网 时间:2024/06/06 05:52

一、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
原创粉丝点击