• 实验11——java线程模拟卖票


    package cn.tedu.demo;
    
    /**
     * @author 赵瑞鑫 E-mail:1922250303@qq.com
     * @version 1.0
     * @创建时间:2020年7月31日 下午2:28:24
     * @类说明: 綫程的生命周期:從創建到消亡。新建狀態:new
     *       Thread();就緒狀態:start();阻塞狀態:sleep(),wait();運行狀態:run();
     *       消亡:執行完run方法的語句就自然消亡了,再次使用須再次創建
     *       綫程的優先級:不同優先級:高優先級先執行,低優先級后執行;同一優先級:先到先服務;
     *       綫程優先級的定義:怎麽規範綫程的優先級:系統默認綫程的優先級。 人爲設置綫程的優先級。
     *       綫程的同步:儅多個綫程共同訪問一個共享變量時,可能會導致共享變量的不完整或者説不安全(解決方案:pv操作)
     *       爲了共享變量的安全性,使用同步機制保證共享變量的安全性
     *       當一個綫程改變共享變量時,其他綫程不能使用共享變量,儅綫程計算完成後,其他綫程才可以使用共享變量(
     *       使用Synchronized關鍵字實現綫程同步;同步塊:Synchronized(鎖對象){操作共享變量的代碼(運算)})
     *       在方法Synchronized上用此關鍵字修飾的方法叫做同步方法
     */
    public class Demo7 {
        private static int ticket = 10;
    
        public static void test1() {
            Thread r = new Thread() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    while (true) {
                        synchronized (Demo7.class) {
    
                        if (ticket <= 0) {
                            try {
                                throw new Exception("票賣完了");
                            } catch (Exception e) {
                                // TODO: handle exception
                                System.out.println(e.getMessage());
                                break;
                            }
                        } else {
                                Demo7.ticket--;
                                System.out.println(Thread.currentThread().getName() + "賣了一張票,還剩" + ticket + "張");
                            }                        
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                }
            };
            r.start();
        }
    
    
        public static void test2() {
            Thread t1 = new Thread(() -> {
                for (int i = 1; i < 11; i++) {
                    System.out.println("t1");
                }
            });
            Thread t2 = new Thread(() -> {
                for (int i = 1; i < 11; i++) {
                    System.out.println("t2");
                }
            });
            Thread t3 = new Thread(() -> {
                for (int i = 1; i < 11; i++) {
                    System.out.println("t3");
                }
            });
            t3.setPriority(Thread.MAX_PRIORITY);
            t1.setPriority(Thread.NORM_PRIORITY);
            t2.setPriority(Thread.MIN_PRIORITY);
            t1.start();
            t2.start();
            t3.start();
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            test1();
        }
    
    }
    作者:赵瑞鑫。支持原创,从你我做起。
  • 相关阅读:
    wpf 样式
    珠宝软件操作手册
    解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to...
    Jquery页面中添加键盘按键事件,如ESC事件
    .NET中ToString()的用法
    Springboot-shiro-redis实现登录认证和权限管理
    redis读书笔记
    mongoDB工具类以及测试类【java】
    自己的mongodb的CRUD封装
    这两天学的线程池归纳
  • 原文地址:https://www.cnblogs.com/Winer-Jiu/p/13428259.html
Copyright © 2020-2023  润新知