线程调度
线程调度程序根据线程优先级决定每个线程应当何时运行。理论上,优先级更高的线程比优先级更低的线程会获得更多的CPU时间。实际上,线程得到的CPU时间除了依赖于优先级外,通常还依赖于其他几个因素(例如,操作系统实现多任务的方式可以会影响CPU时间的相对可用性)。
具有更高优先级的线程还可能取代更低优先级的线程。例如,当一个低优先级的线程运行时,需要恢复一个更高优先级的线程(例如,从休眠或等待I/O中恢复)时,高优先级的线程将取代低优先级的线程。
理论上,具有相同优先级的线程应当得到相等的CPU时间。但是,java被设计在范围广泛的环境种运行。有些环境实现多任务的方式与其他环境不同。为了安全起见,具有相同优先级的线程应当时不时释放控制权。这样可以确保所有线程在非抢占式操作系统中有机会运行。
实际上,即使是在非抢占式环境中,大部分线程仍有机会运行,因为大部分线程不可避免的会遇到一些阻塞情况,例如I/O等待。
发生这种情况时,阻塞的线程被挂起,其他线程就可以运行。但是,如果希望平滑多个线程执行,最好不要依赖于这种情况。此外,某些类型的任务是CPU密集型的。这种线程会支配CPU。对于这类线程,要经常释放控制权,以使其他线程能够运行。
线程两种调度模型
1.分时调度模型
所有线程轮流使用CPU的控制权,平均分配CPU的占用时间。
2.抢占式调度模型
优先让优先级更高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的时间会多一些。
java使用的是抢占式调度模型。
设置优先级
public final void setPriority(int newPriority)
参数:newPriority取值范围为1-10。
线程休眠
try {
Thread.sleep(10);//以毫秒为单位。10毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
sleep()属于静态方法,可以直接使用类名调用。
等待指定线程终止
ThreadJoin tj = new ThreadJoin();
Thread thread = new Thread(tj, "tj");
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
join()方法会一直等待tj线程的结束,当tj线程执行完毕后才会继续往下执行。
也可以使用isAlive()方法来判断一个线程是否执行完成,如果线程在运行则返回true,否则返回false。
守护线程(后台线程)
public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
简单理解为,主线程结束时,守护线程同时结束。设置true为守护线程。
线程中断
线程中断的两种方式
public final void stop()
public void interrupt()
区别
stop()让线程停止。
interrupt()中断线程。将线程状态终止。并跑出InterruptedException异常。