一、线程等待:

有两种方法可以判定一个线程是否结束。


第一,可以在线程中调用isAlive()。这种方法由Thread定义,它的通常形式如下:


final boolean isAlive( )


如果所调用线程仍在运行,isAlive()方法返回true,如果不是则返回false。


但isAlive()很少用到,等待线程结束的更常用的方法是调用join(),描述如下:


final void join( ) throws InterruptedException


该方法等待所调用线程结束。该名字来自于要求线程等待直到指定线程参与的概念。join()的附加形式允许给等待指定线程结束定义一个最大时间。


package cn.thread.day23;

public class ThreadTwo extends Thread{

	public void run(){
		for(int i=5;i>0;i--){
			System.out.println(this.getName()+":"+i);
			try {
				Thread.sleep(1000);//使正在执行的程序休眠1000毫秒
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


package cn.thread.day23;

public class ThreadTwoTest {
/**如果没有下面检查线程活动状态,调用线程run方法时 同时执行下面输出,
 * 所以控制台会先执行下面输出,再输出倒计时
 *  主线程开始执行:
	主线程执行结束:
	线程t:5
	线程t:4
	线程t:3
	线程t:2
	线程t:1
 */
	public static void main(String[] args) {
		System.out.println("主线程开始执行:");
		ThreadTwo t = new ThreadTwo();//创建线程
		//Thread t1 = new ThreadTwo();//多态,父类变量引用子类实例
		t.setName("线程t");
		t.start();//使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
		//checkModeThread(t);
		
		//cheakModeThreadByjion(t);
		
		System.out.println("主线程执行结束:");
		
		timeDelay();//延时方法
	}
	/**
	 * 检查线程活动状态1,输出如下:
	 *  主线程开始执行:
		线程t:是活动状态
		线程t:5
		线程t:是活动状态
		线程t:4
		线程t:是活动状态
		线程t:3
		线程t:是活动状态
		线程t:2
		线程t:是活动状态
		线程t:1
		线程t:是活动状态
		线程t:是停止状态
		主线程执行结束:
	 */
	public static void checkModeThread(ThreadTwo n){
		while(true){
			boolean flag = n.isAlive();//测试线程是否处于活动状态。 
			if(flag){
				System.out.println(n.getName()+":是活动状态");
			}else{
				System.out.println(n.getName()+":是停止状态");
				break;
			}
			try {
				Thread.sleep(1000);//每隔一秒检查一次
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	/**
	 * 检查线程活动状态2,输出如下:
	 *  主线程开始执行:
		线程t:5
		线程t:4
		线程t:3
		线程t:2
		线程t:1
		线程t:终止
		线程t:停止状态
		主线程执行结束:
	 */
	public static void cheakModeThreadByjion(ThreadTwo t){
		try {
			t.join();//等待该线程终止.
			System.out.println(t.getName()+":终止");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		if(!t.isAlive()){
			System.out.println(t.getName()+":停止状态");
		}
	}
	/**3秒后往下执行方法:
	 *  主线程开始执行:
		主线程执行结束:
		线程t:5
		线程t:4
		线程t:3
		主线程2执行结束:
		线程t:2
		线程t:1
	 */
	public static void timeDelay(){
		try {
			Thread.sleep(3000);//3秒后往下执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("主线程2执行结束:");
	}
}


二、线程优先级:

     

线程优先级被线程调度用来判定何时每个线程允许运行。理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定。

一个优先级高的线程自然比优先级低的线程优先。设置线程优化级只是让线程先执行的概率增大并不保证该线程一定先执行.

设置线程的优先级,用setPriority()方法,该方法也是Tread 的成员。它的通常形式为:
final void setPriority(int level)

这 里 , level 指定了对所调用的线程的新的优先权的设置。Level的值必须在MIN_PRIORITY到MAX_PRIORITY范围内。通常,它们的值分别是1和10。要返回一个线程为默认的优先级,指定NORM_PRIORITY,通常值为5。这些优先级在Thread中都被定义为final型变量。