详解Java中的线程模型与线程调度
线程模型
在Java中,线程的实现是基于OS的线程(Native Thread)实现的。每个Java线程对应了一个OS线程。
线程模型主要由执行线程和阻塞线程两部分组成。执行线程就是正在执行的线程,阻塞线程就是等待某些事件或条件才能执行的线程。
当线程遇到IO或者锁时,线程进入阻塞状态,被加入到对应的阻塞队列中。等待IO或者锁释放时被唤醒,进入到就绪状态。当线程获得CPU时间片时,进入执行状态。
线程调度
Java提供了线程调度器(Thread Scheduler)来管理线程。它以一定的策略选择下一个执行的线程。
线程是以优先级的形式来竞争CPU资源的,优先级高的线程会获得更多的执行时间。Java中线程的优先级用1-10表示,10为最高优先级,5为默认优先级。
此外,Java线程还可以设置为守护线程。当所有用户线程执行完毕时,JVM会自动退出,但守护线程不会阻止JVM的退出。
示例
示例一
下面是一个简单的Java多线程例子,实现了3个线程A、B、C,每个线程循环打印指定的字母,与其他线程交替执行,如ABCABC……
public class AlternatePrint {
private volatile int flag = 1; // 标识变量,为1表示打印A,为2表示打印B,为3表示打印C。
public void printA() throws InterruptedException {
synchronized (this) {
while (flag != 1) {
this.wait();
}
System.out.print("A");
flag = 2;
this.notifyAll();
}
}
public void printB() throws InterruptedException {
synchronized (this) {
while (flag != 2) {
this.wait();
}
System.out.print("B");
flag = 3;
this.notifyAll();
}
}
public void printC() throws InterruptedException {
synchronized (this) {
while (flag != 3) {
this.wait();
}
System.out.print("C");
flag = 1;
this.notifyAll();
}
}
public static void main(String[] args) {
AlternatePrint obj = new AlternatePrint();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
obj.printA();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
obj.printB();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
obj.printC();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
示例二
下面是一个定时任务在主线程睡眠时执行的Java例子。在这个例子中,使用了定时器(Timer),该定时器可以周期性地执行任务。
import java.util.Timer;
import java.util.TimerTask;
public class TimerExample {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
int count = 0;
@Override
public void run() {
count++;
System.out.println("定时任务执行次数:" + count);
}
};
timer.schedule(task, 0, 1000);//每1秒执行一次任务
System.out.println("主线程睡眠5秒钟");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
System.out.println("定时任务结束");
}
}
在以上示例中,定时任务每1秒执行一次,主线程睡眠5秒钟后取消了定时任务。注意到定时任务是在主线程睡眠的时候被执行的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中的线程模型与线程调度 - Python技术站