【Java基础】:线程控制

        Java提供了一些控制线程执行顺序的非常方便的工具方法,通过这些便捷的工具方法可以让我们更加灵活地控制线程的执行。

        今天我们主要讨论控制线程的几个常用方法:join、sleep、yield以及如何调整线程的优先级。

        Join线程

        Thread提供了让一个线程等待另一个线程完成之后自己再接着执行的方法:join方法。当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到被join方法加入的join线程执行完成为止。

        线程sleep

        如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep方法。

       

 

        线程yield

        yield方法是一个和sleep方法有点类似的方法,它也是一个Thread类提供的静态方法,它也可以让当前正在执行的线程暂停,但是它不会阻塞该线程,它只是将该线程转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield方法暂停之后,线程调度器又再一次调度出来它重新执行。

        实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同,或者优先级比当前线程更高的就绪状态的线程才有可能获得执行的机会。

        那么sleep方法和yield方法的区别是什么呢?

        1sleep方法暂停当前线程后,会给其他线程执行的机会,不会关心其他线程的优先级是否比当前线程高还是低。而yield方法则只会给优先级相同或者优先级更高的线程执行机会。

      2sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态,而yield方法不经过阻塞状态,直接强制进入就绪状态。因此完全有可能某个线程调用了yield方法之后,立即再次获得处理器资源接着执行。

        3sleep方法声明抛出InterruptedException异常,所以调用sleep方法时要么捕捉该异常,要么显式声明抛出该异常。而yield方法则没有必要声明抛出任何异常。

        4sleep方法比yield方法有更好的移植性,通常不建议使用yield方法来控制并发线程的执行。

        改变线程优先级

        在上文介绍yield方法时,提到了线程的优先级。那么线程的优先级如何设置呢?

        每个线程默认的优先级都与创建它的父线程具有相同的优先级,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也有普通优先级。

        Thread提供了setPriority(intnewPriority)和getPriority()方法来设置和返回指定线程的优先级,其中setPriority方法的参数可以是一个整数,范围为1-10之间,也可以使用Thread类的三个静态常量:分别是MAX_PRIORITY=10,MIN_PRIORITY=1和NORM_PRIORITY=5。

        后台进程

        最后再来说一说这个后台进程,顾名思义就是在后台运行的线程,他的任务是为其他的线程提供服务,这种线程被称为Daemon Thread,又被称为守护线程或者是精灵线程。JVM的垃圾回收线程就是典型的后台线程。后台线程有个特征:如果所有的前台线程都死亡了,后台线程会自动死亡。

        调用Thread对象的setDaemon(true)方法可以将指定线程设置成后台线程,但是需要注意的是setDaemon方法必须在start方法之前被调用,才可以成功设置为后台线程。还有一个用于判断指定线程是否为后台进程的方法——isDaemon()。当整个虚拟机中只剩下后台进程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。

你可能感兴趣的:(【Java】,多线程,控制)