多线程编程中只有一个线程运行的问题

#博学谷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锁之前,将线程休眠即可。

运行结果:
在这里插入图片描述
这是我学习中遇到的问题和解决方案,发该博客是为了记录遇到的这些情况,希望可以给看到的你有所帮助,如有不足,请指出。

  • 10
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 5

打赏作者

一只努力study的程序猿

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值