用户线称与守护线程
java 中有两种线程:用户线程和守护线程。可以通过isDaemon()方法来区别它们:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”。用户线程一般用于执行用户级任务,而守护线程也就是“后台线程”,一般用来执行后台任务。需要注意的是:Java虚拟机在“用户线程”都结束后会后退出,不用等待守护线程执行完毕。守护线程是为用户线程服务的。
线程优先级
线程的优先级用数字来表示,默认范围是1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORTY.其中1为最低的优先级,而10为优先级最高。一个线程的默认优先级是5,即Thread.NORM_PRIORTY。
对优先级操作的方法:
int getPriority():得到线程的优先级
void setPriority(int newPriority):当线程被创建后,可通过此方法改变线程的优先级
必须指出的是:线程的优先级无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大。并不是绝对先调用优先级高的线程后调用优先级低的线程。
看一个例子:
/*
* 线程的优先级
*/
public class MyPriority {
public static void main(String[] args) {
// TODO Auto-generated method stub
Priority mp = new Priority();
Thread t1 = new Thread(mp,"线程1");
Thread t2 = new Thread(mp,"线程2");
Thread t3 = new Thread(mp,"线程3");
Thread t4 = new Thread(mp,"线程4");
Thread t5 = new Thread(mp,"线程5");
//在启动前设置优先级
t1.setPriority(Thread.MIN_PRIORITY); //可以写1-10的数字
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.NORM_PRIORITY);
t4.setPriority(Thread.MAX_PRIORITY);
t5.setPriority(Thread.MAX_PRIORITY);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class Priority implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
}
}
在上面例子中建立了5个线程,2个高优先级,2个低优先级,1个低优先级。我们运行程序后发现,大多数的结果都是这样:
但是还经常会出现这样: