如题,如果想要结果有顺序应该怎么操作?
内容如下图所示
多线程还想控制顺序?想多了吧,每个线程得到的时间轮片的时机是不一样的,所以是执行顺序难以保证,除非加线程锁,具体怎么用百度一下
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);
}
}
}
}