多线程运行,基于CPU的时间片调度机制,线程运行的情况也会不同,优先级也不能够做到控制线程之间的运行顺序,所以如果需要让几个线程间有序的执行,需要根据运行的规则,自己定义一个线程类。
代码demo:
public class SortThread extends Thread {
//锁
private Object lock;
//要打印的字母
private String printChar;
//需要打印字母的顺序所对应的取余值
private int position;
//要循环打印几次,线程私有的
private int printCount = 0;
//初始化数值,用来决定应该打印哪个字母,线程共享的
private volatile static int number = 1;
public SortThread(Object lock, String printChar, int position) {
super();
this.lock = lock;
this.printChar = printChar;
this.position = position;
}
@Override
public void run() {
//加锁
synchronized (lock) {
//无限循环
while (true) {
//判断是否轮到相应的字母打印
if (number % 3 == position) {
System.out.println(Thread.currentThread().getName() + "第" + number + "打印" + printChar);
//唤醒所有等待中的线程,重新竞争锁
lock.notifyAll();
//每打印一次,number就要加一,表示接下来需要打印的字母是哪个
number++;
//线程私有的printCount也要加一,这样打印5次之后就会退出循环
printCount++;
if (printCount == 5) {
break;
}
} else {
try {
//如果线程还没到打印的时候,就先让出锁,进入等待队列
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
Object lock = new Object();
SortThread thread1 = new SortThread(lock, "A", 1);
SortThread thread2 = new SortThread(lock, "B", 2);
SortThread thread3 = new SortThread(lock, "C", 0);
thread1.start();
thread2.start();
thread3.start();
}
}
运行结果:
总结
思路其实很清晰,以上线程运行的有序性,就是根据position参数来定义的,number参数可以理解为几个线程运行的总次数,然后通过取余来对线程的运行顺序做个直观化的判断,配合上wait()和notifyAll()方法,让符合条件的线程运行,不符合条件的线程等待,加锁也是为了保证多线程运行时的线程安全。