多线程04:《疯狂Java讲义》学习笔记——控制线程

注:此文为学习《疯狂Java讲义》的笔记,因此内容全部来自于该书中。

1.join线程

        Thread提供了让一个线程等待另一个线程完成的方法,join()方法。调用线程会阻塞,直到被join()方法加入的jion()线程执行完为止。

         join()方法有三种重载形式,(1)join()等待被join线程执行完成。(2)join(long mills),等待被join线程的时间最长为mills毫秒,如果在mills毫秒内被join的线程还没有执行结束,不再等待。(3)join(long millis,int nanos),等待被join的现场的时间最长为millis毫秒加nanos毫微妙。


2.后台线程

        在后台运行,它的任务是为其他的线程提供服务,这种线程被称为“后台线程”,又称为“守护线程”或“精灵线程”。JVM垃圾回收线程就是后台线程。

        特征:如果所有的前台线程死亡,后台线程会自动死亡。

        Thread对象的setDaemon(true)方法可将指定线程设置为后台线程。isDaemon()方法用来判断指定线程是否是后台线程。

        当所有前台线程死亡,后台线程随之死亡。当JVM中只剩下后台线程,JVM退出。


3.线程睡眠:sleep

        让当前正在执行的线程暂停一段时间,进入阻塞状态,则可以通过调用Thread类的静态sleep()方法实现。

       static voidsleep(long millis),让当前正在执行的线程暂停millis毫秒,进入阻塞状态。

       static voidsleep(long millis,int nanos),让当前正在执行的线程暂停millis毫秒加nanos毫微妙,并进入阻塞状态。


4.线程让步:yield

        让当前正在执行的线程暂停,但不会阻塞该线程,将线程转入就绪状态。存在可能:当某线程调用了yiled()方法暂停,线程调度器又将其调度出来重新执行。

        某个线程调用了yield()方法暂停之后,只有优先级与当前线程相同或高于当前线程的处于就绪状态的线程才会获得执行的机会。

        sleep()方法与yield()方法的区别如下。(1)sleep方法暂停当前线程后,会给其他线程执行机会,不理会其他线程的优先级;但yield()方法只会给优先级相同或优先级更高的线程执行的机会。(2)sleep()方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态;yield()方法不会将线程转入阻塞状态,只是强制当前进程进入就绪状态。(3)sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显式声明抛出该异常;而yield()方法则没有声明抛出任何异常。(4)sleep()方法比yield()方法有更好的可移植性,通常不建议用yield()方法控制并发线程的执行。


5.改变线程优先级

        每个线程执行时都有一定的优先级。优先级高的线程获得较多的执行机会,优先级低的线程获得较少的执行机会。

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

        Thread类提供了setPriority(int newPrioritye)、getPriority()方法来设置和返回指定线程的优先级,其中setPriority()方法的参数可以是一个整数,范围是1-10之间,也可以使用Thread类如下三个静态常量:

        MAX_PRIORITY,值为10。

        MIN_PRIORITY,值为1。

        NORM_PRIORITY,值为5。

你可能感兴趣的:(Java基础)