#博学谷IT学习技术支持#
一、问题概述
最近在学习多线程的时候,遇到了一个很奇怪的问题。在模拟多窗口卖车票的实例下,就是代码明明写的没有问题,但是
在运行时就只有一个线程在运行,以下是我的代码。
Ticket类的代码:
import java.util.concurrent.locks.ReentrantLock;
public class Ticket implements Runnable{
private static int ticketCount = 100;
private Object obj = new Object();
//lock锁
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
//lock锁
try {
lock.lock();
if (ticketCount == 0) {
//票卖完了 需要break
break;
} else {
Thread.sleep(100);
ticketCount--;
System.out.println(Thread.currentThread().getName() + "在卖票,还剩" + ticketCount + "张票");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
}
Demo类的代码:
public class Demo {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread t1 = new Thread(ticket);
Thread t2 = new Thread(ticket);
Thread t3 = new Thread(ticket);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
运行结果:
窗口一在卖票,还剩99张票
窗口一在卖票,还剩98张票
窗口一在卖票,还剩97张票
…
窗口一在卖票,还剩2张票
窗口一在卖票,还剩1张票
窗口一在卖票,还剩0张票
二、解决方法
一开始我以为是我代码写的有疏忽,我就认真核查我的代码,发现无论逻辑还是编写,都与老师的没有差异,于是,我
便自己百度这个问题。搜索了很多次,总结了几个帖子,最后发现这个问题并不是代码的问题,而是电脑硬件的问题。现在
电脑成本越来越低,配置逐渐升级。cpu性能强的话,只会一个线程执行,直到很多次以后才会调度第二个线程。而在一些
老旧的电脑上,便可以看到多个窗口售卖的情况。
或者将售卖的票数调多,这样也可以轮到窗口二,三售卖线程的执行。
还有一种方法便是在进入锁之前,将线程进行短暂休眠,从而给每个线程抢占到cpu的机会,这样也可以看到多个窗口
售卖车票的情况。例:
public void run() {
while (true) {
// cpu性能强的话,只会一个线程执行,直到很多次以后才会调度第二个线程
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// synchronized (obj) {//多个线程用同一把锁
//lock锁
在循环之内,lock锁之前,将线程休眠即可。
运行结果:
这是我学习中遇到的问题和解决方案,发该博客是为了记录遇到的这些情况,希望可以给看到的你有所帮助,如有不足,请指出。