为什么结果不是顺序的啊?

如题,如果想要结果有顺序应该怎么操作?

内容如下图所示

img

img

多线程还想控制顺序?想多了吧,每个线程得到的时间轮片的时机是不一样的,所以是执行顺序难以保证,除非加线程锁,具体怎么用百度一下


package test2;

public class ThreadTest {
    public static void main(String[] args) {
        ThreadSale threadSale = new ThreadSale();
        Thread t1 = new Thread(threadSale,"第1售票窗口");
        Thread t2 = new Thread(threadSale,"第2售票窗口");
        Thread t3 = new Thread(threadSale,"第3售票窗口");
        Thread t4 = new Thread(threadSale,"第4售票窗口");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class ThreadSale implements Runnable {
    int tickets = 120;
    @Override
    public synchronized void run() {
        while (true) {
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                + "售票机第" + tickets-- + "号;");
            }else {
                System.exit(0);
            }
        }
    }
}

@SneakyThrows 是lombok的类,没有的话可以换成try catch

// 效果可能差一点
class ThreadSale implements Runnable {
    private volatile int tickets = 120;

    @SneakyThrows
    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName()
                            + "售票机第" + tickets-- + "号;");
                } else {
                    System.exit(0);
                }
            }
            Thread.sleep(0); // Thread.yield();
        }
    }
}

class ThreadSale implements Runnable {
    private volatile int tickets = 120;

    @SneakyThrows
    @Override
    public synchronized void run() {
        while (true) {
            if (tickets > 0) {
                System.out.println(Thread.currentThread().getName()
                        + "售票机第" + tickets-- + "号;");
                notifyAll();
                wait();
            } else {
                System.exit(0);
            }
        }
    }
}