zoukankan      html  css  js  c++  java
  • 第九周课堂总结和实验

    实验任务详情:

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

    实验代码:

    复制代码
    package demo;
    
    class MyThread implements Runnable{
        private int ticket = 1000;
        public void run() {
            for (int i=0;i<100;i++){
                synchronized (this){
                    if (ticket>0){
                        try {
                            Thread.sleep(1000);
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"售票:ticket="+ticket--);
                    }
                }
            }
        }
    }
    public class test {
        public static void main(String[] args) {
            MyThread mt=new MyThread();            
            new Thread(mt,"窗口1").start();                
            new Thread(mt,"窗口2").start();
            new Thread(mt,"窗口3").start();
            new Thread(mt,"窗口4").start();
            new Thread(mt,"窗口5").start();
            new Thread(mt,"窗口6").start();
            new Thread(mt,"窗口7").start();
            new Thread(mt,"窗口8").start();
            new Thread(mt,"窗口9").start();
            new Thread(mt,"窗口10").start();
        }
    }
    复制代码

    结果截图:

    实验总结:

    这个题老师上课讲过,书上也有类似的代码,还算比较简单。就是有一个小瑕疵,总是连续一个窗口卖票,也不知道是cpu的问题还是什么。

    课程总结:

    1)多线程继承Tread类:

    复制代码
    class 类名称 extends Thread{
          属性***;
          方法***;
          public void run(){
               线程主体;
          }
    }
    复制代码

    2)Rnunable接口实现多线程:

    复制代码
    class 类名称 implements Runnable{
         属性***;
         方法***;
         public void run(){
              线程主体;
         }
    }
    复制代码

    3)synchronized

    (1)指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。

    (2)直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。

    (3)直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

    学习总结
    1,继承Thread类创建线程:
    Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

    2,实现Runnable接口创建线程:
    如果自己的类已经extends另一个类,就无法直接extends Thread,此时,可以实现一个Runnable接口

    3,Thread类和Runnable接口的区别
    实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。

    4,通过synchronized实现资源同步

    synchronized 关键字可以在整个class下进行锁定,避免static数据的同时访问。
    当编写synchronized块时,有几个简单的准则可以遵循,这些准则在避免死锁和性能危险的风险大有帮助:
    (1) 使代码块保持简短,把不随线程变化的预处理和后处理移出synchronized块 
    (2) 不要阻塞。如 InputStream.read() 
    (3) 在持有锁的时候,不要对其他对象调用方法

    Java IO

    使用File类进行文件的操作
    以下是针对文件本身操作的
    createNewFile(); 创建新文件
    delete(); 删除一个指定文件
    mkdir(); 创建一个文件夹
    public String[]list(); 列出全部名称,返回一个字符串数组
    public File[]listFiles(); 列完整的路径,返回一个File对象数组
    isDirectory(); 判断一个给定的路径是否是目录

    RandomAccessFile类可以对文件内容进行操作
    不同操作系统的路径分隔符也是不同的,windows的是“”,Linux的是“/”。

    所有的操作是由JAVA虚拟机进行的,所以会出现一定的延迟,所以在进行文件操作时要考虑延迟的影响

  • 相关阅读:
    五大常用算法之三:贪心算法
    五大常用算法之二:动态规划算法
    pycharm最新激活码2020
    pgsql安装 centos自带的9.2.4
    centos 7+ 安装python虚拟环境
    常见HTTP状态码
    python搜索引擎和框架
    中文分词工具jieba的使用
    django分页功能 views与templates
    Django-Celery异步发送激活邮件,以及注意点
  • 原文地址:https://www.cnblogs.com/songjiah/p/11740797.html
Copyright © 2011-2022 走看看