线程优先级
Java提供一个线程调度器来监控程序中所有线程的调度,它会优先调度优先级高的线程,不过具体调度哪个,看CPU心情。
线程的优先级(priority)分为10个等级,10最大,1最小。
对于1,5,10 有专门的称呼,
Thread.MIN_PRIORITY=1
Thread.NORM_PRIORITY=5
Thread.MAX_PRIORITY=10
可以使用getPriority()方法来获取线程优先级
可以使用setPriority(int xxx)方法来改变线程的优先级
public class TestPriority {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"优先级是:"+Thread.currentThread().getPriority());
MyPriority m1 = new MyPriority();
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m1);
Thread t3 = new Thread(m1);
Thread t4 = new Thread(m1);
Thread t5 = new Thread(m1);
t1.setPriority(2);
t1.start();
t2.setPriority(4);
t2.start();
t3.setPriority(6);
t3.start();
t4.setPriority(8);
t4.start();
t5.setPriority(10);
t5.start();
}
}
class MyPriority implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"优先级是:"+Thread.currentThread().getPriority());
}
}
这里就是创建了许多线程来分别测试他们的优先级,经过多次实验之后发现优先级高的线程被调用的次数会比较多,一般线程默认优先级为5,也就是Thread.NORM_PRIORITY
这便是优先级的作用。
守护线程(Daemon)
线程分为用户线程和守护线程,其中用户线程(main)就是我们创造出来的线程,而守护线程就是在背后运行的线程,例如后台记录的操作日志,监控内存,垃圾清理(GC)。
注意:Java必须在JVM上面运行,而居民作为虚拟机,必须要等待用户线程运行完毕,而不需要等待守护线程运行完毕,所以守护线程一直都在运行。
可以使用thread.setDaemon(boolean)方法来设置守护线程,
下面通过一个例子来解释:
public class TestDaemon {
public static void main(String[] args) {
God god = new God();
I i = new I();
Thread thread = new Thread(god);
thread.setDaemon(true);
thread.start();
new Thread(i).start();
}
}
class God implements Runnable{
@Override
public void run() {
System.out.println("上帝保护你!");
}
}
class I implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 100; i++) {
System.out.println("这是我活着的第"+i+"年");
}
}
}
这里模拟上帝守护你的例子,其中上帝作为守护线程,一直守护着 I 这个线程。