zoukankan      html  css  js  c++  java
  • 第九周课程总结&实验报告(七)

    第九周课程总结&实验报告(七)

    实验任务详情:

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

    1.实验源码:

    package MYRunnable;
    
    import java.util.concurrent.locks.Lock;//导入java.util.concurrent包,其中有接口Lock
    import java.util.concurrent.locks.ReentrantLock;
    
    public class MYRunnable{
        public static void main(String[] args){
            Ticket t1=new Ticket();
            Thread A1=new Thread(t1,"窗口1");  //十个窗口卖票
            Thread A2=new Thread(t1,"窗口2");
            Thread A3=new Thread(t1,"窗口3");
            Thread A4=new Thread(t1,"窗口4");
            Thread A5=new Thread(t1,"窗口5");
            Thread A6=new Thread(t1,"窗口6");
            Thread A7=new Thread(t1,"窗口7");
            Thread A8=new Thread(t1,"窗口8");
            Thread A9=new Thread(t1,"窗口9");
            Thread A10=new Thread(t1,"窗口10");
            A1.start();
            A2.start();
            A3.start();
            A4.start();
            A5.start();
            A6.start();
            A7.start();
            A8.start();
            A9.start();
            A10.start();
        }
    }
    
    class Ticket implements Runnable{   //实现Runnable接口
        private int tickets=1000;
        Lock lock =new ReentrantLock();//使用接口Lock的对应的实现类ReentrantLock
    
        public int getNumbers() {
            return tickets;
        }
    
        public void setNumbers(int numbers) {
            this.tickets = numbers;
        }
            
        public void run(){    //覆写run()方法
            while(getNumbers()>0){
                lock.lock();//手动获取锁
                    if(getNumbers()>0){
                    
                    try{
                        Thread.sleep(100);//卖票中休眠一秒
                    }
                    catch(Exception e){
                        e.printStackTrace();
                    }
                    tickets--;
                    System.out.println(Thread.currentThread().getName()+"卖了一张票,还剩下"+getNumbers()+"张票");
                }
                    lock.unlock();//手动释放锁
            }
        }
    
    }

    2.实验结果截图:

     

     

    3.实验的过程和问题:

    首先这个题目并不难,书上有类似的题目,在上机课上就对照着书写好了代码,运行结果也没有什么问题,十个窗口都在卖票。但是今天用自己电脑运行后发现有时只有窗口一在卖票,有时也会只有前几个窗口在卖票,后来在网上搜索了解决办法,用了同步代码块和同步方法,进行上锁,但是也没有解决问题。后来考虑到上机的电脑可以运行,会不会是cpu核心的问题,运行速度的问题,于是我就把cpu核心数由四个改成一个,成功的让十个窗口同时卖票。但是具体是什么原理并不清楚,可能和cpu速度有关。

    课程学习总结:

    Java 提供了三种创建线程的方法:

    • 通过实现 Runnable 接口;

    为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:public void run()

    • 通过继承 Thread 类本身;

    创建一个新的类,该类继承 Thread 类,然后创建一个该类的实例。继承类必须重写 run() 方法,必须调用 start() 方法才能执行。

    • 通过 Callable 和 Future 创建线程。

    thread类和runnable接口的区别:

    1.实现Runnable接口可以实现资源共享而继承Thread类不能资源共享,也就是实现Runnable接口是多个线程共同完成一个任务,继承Thread类是一个是多个线程分别完成自己的任务。

    2.现Runnable接口相对于继承Thread类来说,有如下优势:

    (1)适合相同程序的多个线程去处理同一资源的情况。

    (2)可以避免由于Java的单继承特性带来的局限。

    (3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

    使用同步解决问题:

    synchronized  方法返回值 方法名称(参数列表){

      //方法体

    }

    java IO

    1.使用File操作文件

    使用File类可以进行创建或删除文件等常用操作

    File.pathSeparator表示“;”,File.Separator表示“"。createNewFile()方法创建文件,mkdir()方法创建文件夹。

    学习总结:

    本周主要学习了多线程和java IO,作业虽然完成了,但多线程问题中还是有一些不明白,可能和cpu的速度和调用有关,希望以后在实际问题中能更好的理解。

  • 相关阅读:
    CentOS部署ElasticSearch7.6.1集群
    Linux安装Elasticsearch7.x
    ElasticSearch安装为Windows服务
    SolrNet Group分组 实现
    ubuntu 下安装sublime
    LeetCode 3: Longest Substring Without Repeating Characters
    LeetCode 179: Largest Number
    LeetCode 1: Two Sum
    LeetCode 190: Reverse Bits
    LeetCode 7: Reverse Integer
  • 原文地址:https://www.cnblogs.com/198266qq/p/11738895.html
Copyright © 2011-2022 走看看