join线程
在某个线程的执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join()方法加入的线程完成为止。
join()方法有三种重载形式:
- join():等待被join的线程执行完成;
- join(long millis):等待被join线程执行时间最长为millis毫秒。如在millis毫秒内,被join的线程未执行完成,则不再继续等待。
- join(long millis, int nanos):等待被join的线程执行时间为millis毫秒+nanos微秒。
后台线程
后台线程(Deamon Thread)又被称为“精灵线程”或“守护线程”。JVM的垃圾回收线程就是典型的后台线程。
后台线程主要特征:如果所有前台线程都死亡,后台线程会自动死亡。
关于后台线程:
- 调用Thread对象的setDeamon(true)可以将指定线程设置成后台线程;
- setDeamon(true)必须在start()方法之前调用,否则会引发IllegalThreadStateException异常;
- Thread类提供了isDeamon()方法判断是否是后台线程;
- 前台线程创建的子线程默认是前台线程,后台线程创建的子线程默认是后台线程。
线程睡眠
Thread类的Sleep()方法可以使正在执行的线程暂停一段时间,并进入阻塞状态。
在线程sleep时间段内,即使系统中没有其它可运行的线程,处于sleep中的线程也不会运行。
线程让步
yield()也是Thread类的一个方法。同sleep()类似,它也可以让一个线程暂停。但是,它不会阻塞线程,而是直接让线程进入就绪状态,重新等待系统调度器的调度。
实际上,当某个线程调用了yield()方法后,只有优先级与当前线程相同或高于当前线程的处于就绪状态的其他线程才能获得执行的机会。
sleep()和yield()的区别:
- sleep暂停线程后,会给其它线程执行机会,不会理会其他线程的优先级;yield暂停线程后,只会给优先级相同或优先级更高的其他线程机会;
- sleep会将线程转入阻塞状态;yield会将线程直接转入就绪状态;
- sleep方法跑出了InterruptedException,yield方法没有抛出任何异常;
- sleep方法移植性更好。
线程优先级
每个线程执行时都有一定的优先级,优先级高的线程获得更多的执行机会,优先级低的线程获得较少的执行机会。
Thread提供了setPriority和getPriority方法来设置和获取线程优先级。