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

Posted Winer_Jiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验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();
    }

}

 

以上是关于实验11——java线程模拟卖票的主要内容,如果未能解决你的问题,请参考以下文章

Java多窗口卖票问题详解

[Java基础]线程同步之卖票案列分析

java多线程(线程安全,线程同步)

JAVA-基础-线程安全

多线程的小DEMO (模拟卖票系统)

java-利用多线程Runnable,公用一个参数问题