线程状态观测(Thread.State)
- new、runnable、blocked、waiting、timed waiting、terminated
package www.bh.c.threadtest;
public class StateTest {
public static void main(String[] args) {
Thread thread=new Thread(()->{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("=======");
});
Thread.State state = thread.getState();
System.out.println(state);
thread.start();
state=thread.getState();
System.out.println(state);
while (state!=thread.getState().TERMINATED){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
state=thread.getState();
System.out.println(state);
}
}
}
线程优先级
- Java提供了一个线程调度器来监控程序中启动后进入就绪状态后的所有线程,线程调度器按照优先级决定应该调度那个线程来执行
- 线程的优先级用数字表示,范围从1~10
- Thread.MIN_PRIORITY=1;
- Thread.MAX_PRIORITY=10;
- Thread.NORM_PRIORITY=5;(默认为5)
- 使用以下方法可以改变或获取优先级
- getPriority().setPriority(int xxx)
package www.bh.c.threadtest;
public class PriorityTest implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
PriorityTest priorityTest = new PriorityTest();
Thread t1 = new Thread(priorityTest);
Thread t2 = new Thread(priorityTest);
Thread t3 = new Thread(priorityTest);
Thread t4 = new Thread(priorityTest);
Thread t5 = new Thread(priorityTest);
Thread t6 = new Thread(priorityTest);
t1.start();
t2.setPriority(1);
t2.start();
t3.setPriority(3);
t3.start();
t4.setPriority(Thread.MAX_PRIORITY);
t4.start();
t5.setPriority(7);
t5.start();
t6.setPriority(8);
t6.start();
}
}
守护线程(daemon)
- 线程分为用户线程和守护线程
- 虚拟机必须确保用户线程执行完毕
- 虚拟机不用等待守护线程执行完毕
- 如:后台记录操作日志、监控内存、垃圾回收等
package www.bh.c.threadtest;
public class DaemonTest {
public static void main(String[] args) {
Teacher teacher = new Teacher();
Student student = new Student();
Thread thread = new Thread(teacher);
thread.setDaemon(true);
thread.start();
new Thread(student).start();
}
}
class Teacher implements Runnable{
@Override
public void run() {
while (true){
System.out.println("老师守护着学生");
}
}
}
class Student implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("快乐学习100年");
}
}
}