四、线程中常用的方法
1.设置线程的优先级
SetPriority()
a.可以通过设置线程的优先级来改变线程争抢到时间片的概率,优先级高的争抢到时间片的概率越大【并不是说优先级低的抢不到时间片】
b.默认情况下,创建出来的线程优先级都是5,每个线程创建在哪里,就和当前线程有同样的优先级,举例:main线程的优先级为5,在它里面创建出来的子线程优先级全部都是5
c.优先级的取值范围:1~10,默认为5,数字越大,优先级越高
d.这个方法的调用必须在start之前,否则没有任何意义
static int MAX_PRIORITY 10
线程可以具有的最高优先级。
static int MIN_PRIORITY 1
线程可以具有的最低优先级。
static int NORM_PRIORITY 5
分配给线程的默认优先级。
2.让线程休眠
static void sleep(long millis)
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
a.使得当前正在执行的线程进入休眠状态,进入阻塞状态【放弃了时间片】
b.如果设定的时间结束之后,对应的线程还会继续争抢时间片
c.跟线程的优先级没有关系【一般将该方法的调用写在线程的执行体中---run方法中】
3.中断线程
interrupt():表示的并不是将线程结束,而是表示清除阻塞状态
如果一个线程没有处于阻塞状态,这时调用interrupt将不起作用,否则,会引起InterruptedException【该线程预先准备好处理这种状态】
void interrupt()
中断线程。
static boolean interrupted()
测试当前线程是否已经中断。
boolean isInterrupted()
测试线程是否已经中断。
4.线程合并
join()
注意:在执行原来的线程的过程中,如果遇到了合并线程,则优先执行合并进来的线程,当合并线程执行完毕之后,再接着执行原来的线程
特点:
a.合并线程,当前正在执行的线程一定会释放时间片,将时间片让给合并进来的线程
b.哪个线程需要合并,就在线程执行体中调用该方法
c.调用join方法之前,一定要将线程start
5.后台线程
setDeamon(boolean b)
表示的是隐藏起来的一直默默运行的线程,直到线程结束,又被称为精灵线程,也被称为守护线程,举例:JVM的垃圾回收机制就是一个典型的后台线程
特点:如果所有的前台线程死亡,那么后台线程会自动死亡
默认情况下所有的线程都是前台线程
setDeamon(true)才表示当前线程被设置成了后台线程
这个方法的调用必须在start之前
6.线程让步
yield()
和sleep类似
特点:可以让当前正在执行的线程暂停,但是它不会阻塞线程,只是将该线程转入就绪状态,完全可能出现的情况是:当某个线程调用了yield之后,cpu会再次执行该线程
注意:实际上,当某个线程调用yield方法暂停之后,只有优先级与当前线程相同,或者高于当前线程的其他线程才会有争抢时间片的机会
总结:yield方法和sleep方法之间的区别
a.是否和优先级有关:sleep方法暂停当前线程之后,会给其他的线程执行的机会,不会理会线程的优先级;但是yield方法只给优先级和它相等或者高的线程执行的机会
b.是否让线程进入阻塞状态:sleep会让线程进入阻塞状态,直到结束了阻塞状态之后才会转入就绪状态,但是yield不会将线程转入阻塞状态,直接强制当前线程进入就绪状态
c.是否会抛出异常:sleep会抛出InteruptedException,所以调用sleep方法要么捕获异常,要么抛出异常,但是yield方法不会抛出任何异常
d.sleep方法比yield方法更好控制,尽量不要依赖yield方法来控制线程的执行