• 第七次java实验报告


    Java实验报告

    班级 计科二班 学号20188437 姓名 何磊

    完成时间 2019/10/25

    评分等级

    实验四 类的继承

    1. 实验内容

    完成火车站售票程序的模拟。
    要求:
    1)总票数1000张;
    210个窗口同时开始卖票;
    3)卖票过程延时1秒钟;
    4)不能出现一票多卖或卖出负数号票的情况。
    实验过程
    (请自己调整格式)

    (一)

    (1)实验代码

    package火车站售票程序;

     

    class MyThread implements Runnable{

        private int ticket=1000;

        public void run() {

            for(int i=0;i<500;i++){

                try{

                    Thread.sleep(1000);

                }catch(InterruptedException e){

                    e.printStackTrace();

                }

                synchronized(this){

                    if(ticket>0){

                        System.out.println(Thread.currentThread().getName()+"卖票:ticket="+ticket--);

                    }

                }

            }

            

        }

     

    }

    package火车站售票程序;

     

    public class test {

     

        public static void main(String[] args) {

            MyThread mt=new MyThread();

            Thread w1=new Thread(mt,"窗口-1");

            Thread w2=new Thread(mt,"窗口-2");

            Thread w3=new Thread(mt,"窗口-3");

            Thread w4=new Thread(mt,"窗口-4");

            Thread w5=new Thread(mt,"窗口-5");

            Thread w6=new Thread(mt,"窗口-6");

            Thread w7=new Thread(mt,"窗口-7");

            Thread w8=new Thread(mt,"窗口-8");

            Thread w9=new Thread(mt,"窗口-9");

            Thread w10=new Thread(mt,"窗口-10");

            w1.start();

            w2.start();

            w3.start();

            w4.start();

            w5.start();

            w6.start();

            w7.start();

            w8.start();

            w9.start();

            w10.start();

        }

     

    }

    为实现助教要求作以下修改:

    package 火车站售票程序;
    
    class MyThread implements Runnable{
        private int ticket=1000;
        public void run() {
            int sale = 1;
            for(int i=0;i<500;i++){
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
                synchronized(this){
                    if(ticket>0){
                        System.out.println(Thread.currentThread().getName()+"卖票:ticket="+ticket--+",当前窗口卖票数:"+sale++);
                    }
                }
            }
            
        }
    
    }

    (2)运行结果

    总结:本次实验考察了多线程知识的应用,总体比较简单,实验过程中发现synchronized(this){}sleep1000)同步的话会导致此段代码一直被同一个线程占用。

    本周学习了Thread类、Runnable接口、以及线程操作的相关方法。

    一、线程的状态

           每个 Java 程序都有一个缺省的主线程,对于 Java 应用程序,主线程是 main()方法执行的线索;对于 Applet 程序,主线程是指挥浏览器加载并执行 Java Applet 程序的线索。要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

    1、新生状态

           在程序中用构造方法(new操作符)创建一个新线程时,如new Thread(r),该线程就是创建状态,此时它已经有了相应的内存空间和其它资源,但是还没有开始执行。

    2、就绪状态

           新建线程对象后,调用该线程的 start()方法就可以启动线程。当线程启动时,线程进入就绪状态(runnable由于还没有分配CPU,线程将进入线程队列排队,等待 CPU 服务,这表明它已经具备了运行条件。当系统挑选一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态。系统挑选的动作称之为"CPU调度"。一旦获得CPU线程就进入运行状态并自动调用自己的run方法。

    3、运行状态

           当就绪状态的线程被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的 run()方法。 run()方法定义了该线程的操作和功能。运行状态中的线程执行自己的run方法中代码。直到调用其他方法或者发生阻塞而终止。

    4、阻塞状态

           一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入输出操作时,将让出 CPU 并暂时中止自己的执行,进入堵塞状态。在可执行状态下,如果调用 sleep() suspend() wait()等方法,线程都将进入堵塞状态。堵塞时,线程不能进入排队队列,只有当引起堵塞的原因被消除后,线程转入就绪状态。重新到就绪队列中排队等待,这时被CPU调度选中后会从原来停止的位置开始继续执行。

          记住:阻塞被消除后是回到就绪状态,不是运行状态。

    5、死亡状态

          线程调用 stop()方法、destory()方法或 run()方法执行结束后,线程即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。

          不推荐使用stop()方法【会产生异常】  destory()方法【destory是强制终止,不会释放锁】

           

     

    可以通过getState()方法来获取线程当前的状态:NEW RUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED

    线程的状态经典图:

    二、线程的一些常用操作

  • 相关阅读:
    [daily][troubleshoot][archlinux][wps][font] wps文档中的图内容无法显示中文
    [troubleshoot][daily][archlinux][pacman] pacman 与 pip 包文件冲突
    [daily] 宇宙终极shell之zsh
    [knowledge][basic][hardware] 内存的硬件结构(转)
    [troubleshoot][archlinux][X] GPU HANG
    [daily]使用rdtsc指令,测量程序的运行速度 [转]
    [have_fun] 好玩哒小游戏又来啦
    [dpdk] 读开发指南(2)(内容长期整理中)
    [Virtualization][SDN] 讲的很好的SDN软件定义网络视频课程
    [Virtualization][SDN] VXLAN到底是什么 [转]
  • 原文地址:https://www.cnblogs.com/hlywzj/p/11740817.html
Copyright © 2020-2023  润新知