一、线程的调度
程序中的多个线程时并发执行的,但并不是同一时刻执行,某个线程若想被执行必须要得到CPU的使用权,Java虚拟机会按照特定的机制为程序中的每一个线程分配CPU的使用权,这种机制叫线程的调度。
计算机中,线程调度有两种模式:
- 1.分时调度模型:平分CPU的时间片
- 2.抢占式调度模型:优先级高的概率大
- Java虚拟机:默认抢占式调度模型
二、线程优先级
线程优先级:
范围在1-10之间,默认为5
getPriority()和setPriority()
MyThread my1 = new MyThread("giao哥");
MyThread my2 = new MyThread("giao妹");
my1.setPriority(7);
my2.setPriority(6);
my1.start();
my2.start();
三、线程控制
- 前面的优先级高的大概率优先执行(注意是大概率~)
- 如果想要控制线程执行顺序,使正在执行的线程暂停,使用sleep()方法让正在执行的线程进入休眠等待状态,这样其他线程就可以获得执行的机会。
- sleep()方***抛出InteruptedException异常
线程控制:
sleep():使当前正在执行的线程停留(暂停执行)指定的毫秒
public void run() {
for(int i=0;i<100;i++) {
System.out.println(getName()+":"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
join():等待这个线程死亡
try {
my1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
设置主线程为:
Thead.currentThread().setName();
设置守护线程为:
setDaemon(boolean on):
将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
主线程完毕之后其他两个也结束,但不是直接结束!
MyThread my1 = new MyThread();
MyThread my2 = new MyThread();
my1.setName("giao哥");
my2.setName("giao妹");
Thread.currentThread().setName("giao弟");
my1.setDaemon(true);
my2.setDaemon(true);
my1.start();
my2.start();
for(int i=0;i<10;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
四、线程的生命周期
- 在java中,任何对象都有生命周期,线程也不例外,当Thread对象创建完毕时,线程的生命周期就开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常或者错误时,线程的生命周期便结束了。
- Java官方API将线程的整个生命周期分为6个状态,NEW(新建状态)、RUNNABLE(可运行状态)、BLOCKED(阻塞状态)、WAITING(等待状态)、TIMED_WAITNG(定时等待状态)和TERMINATED(终止状态)。
- 在程序中,通过一些操作,可以使线程在不同状态之间转换。