• Java多线程对同一个对象进行操作


    示例:

    三个窗口同时出售20张票。

    程序分析:

    1、票数要使用一个静态的值。

    2、为保证不会出现卖出同一张票,要使用同步锁。

    3、设计思路:创建一个站台类Station,继承THread,重写run方法,在run方法内部执行售票操作!

    售票要使用同步锁:即有一个站台卖这张票时,其他站台要等待这张票卖完才能继续卖票!

    package com.multi_thread;
    
    //站台类
    public class Station extends Thread {
        // 通过构造方法给线程名字赋值
        public Station(String name) {
            super(name);// 给线程起名字
        }
    
        // 为了保持票数的一直,票数要静态
        static int tick = 20;
        // 创建一个静态钥匙
        static Object ob = "aa";// 值是任意的
    
        @Override
        public void run() {
            while (tick > 0) {
                // 这个很重要,必须使用一个锁,进去的人会把钥匙拿在手上,出来后把钥匙让出来
                synchronized (ob) {
                    if (tick > 0) {
                        System.out.println(getName() + "卖出了第" + tick + "张票");
                        tick--;
                    } else {
                        System.out.println("票卖完了");
                    }
                }
                try {
                    // 休息一秒钟
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    package com.multi_thread;
    
    public class MainClass {
        // java多线程同步所的使用
        // 三个售票窗口同时出售10张票
        public static void main(String[] args) {
            // 实例化站台对象,并为每一个站台取名字
            Station station1 = new Station("窗口1");
            Station station2 = new Station("窗口2");
            Station station3 = new Station("窗口3");
            // 让每一个站台对象各自开始工作
            station1.start();
            station2.start();
            station3.start();
        }
    }

    程序运行结果:

    窗口1卖出了第20张票
    窗口3卖出了第19张票
    窗口2卖出了第18张票
    窗口2卖出了第17张票
    窗口3卖出了第16张票
    窗口1卖出了第15张票
    窗口1卖出了第14张票
    窗口3卖出了第13张票
    窗口2卖出了第12张票
    窗口1卖出了第11张票
    窗口3卖出了第10张票
    窗口2卖出了第9张票
    窗口1卖出了第8张票
    窗口3卖出了第7张票
    窗口2卖出了第6张票
    窗口1卖出了第5张票
    窗口3卖出了第4张票
    窗口2卖出了第3张票
    窗口3卖出了第2张票
    窗口1卖出了第1张票

  • 相关阅读:
    最小化x11 debian
    chroot后 运行xeyes Error: Can't open display: :0.0
    std::bind1st和std::bind2nd
    bind1nd,not1,compose1等用法
    python中*和**的参数
    QT静态编译
    Qt中QEvent和信号槽的区别
    JSON文件内容加注释的几种方法
    C语言--#、##、__VA_ARGS__ 和##__VA_ARGS__ 的使用
    QT正则表达式
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/8889219.html
Copyright © 2020-2023  润新知