1、join线程
当在某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,直到被join方法加入的join线程完成为止。
2、后台进程
任务是为其他的线程服务,如JVM的垃圾回收线程。如果所有的前台线程都死亡,后台线程会自动死亡
调用Thread对象setDaemon(true)可将指定线程设置成后台线程,但其必须在start()方法之前调用
3、线程睡眠:sleep
当前线程调用sleep方法后进入阻塞状态,在其sleep时间段内,该线程不会获得执行的机会,即使没有其他可运行的线程,处于sleep中的线程也不会运行,因此sleep方法常用来暂停程序的执行
4、线程让步:yield
让当前正在执行的线程暂停,但不会阻塞线程,而是将其转入就绪状态。yield只是让当前线程暂停一下,让系统的线程调度器重新调度一次,有可能暂停后有重新执行
当某个线程调用yield方法暂停后,只有优先级与当前线程相同,或者比当前线程优先级更高的就绪状态线程才获得执行机会
sleep与yield区别:
1)sleep暂停后会给其他线程执行机会,不理会其他线程优先级,但yield只会给优先级相同或更高的线程执行机会
2)sleep将线程转入阻塞状态,直到阻塞时间到了才会转入就绪状态,而yield不会转入阻塞状态,只强制当前线程进入就绪状态。
3)sleep方法声明抛出异常,调用时要么捕获异常要么显示抛出异常,yield没有声明任何抛出异常
4)sleep比yield有更好的可移植性,通常不依靠yield控制并发线程的执行
5、改变线程优先级
Thread提供了setPriority(int priority)和getPriority()来设置和返回线程优先级
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5