怎么让线程运行具有有序性

多线程运行,基于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()方法,让符合条件的线程运行,不符合条件的线程等待,加锁也是为了保证多线程运行时的线程安全。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/107760876