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

实验任务详情:

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

实验代码:

package 实验七;

public class MyThread implements Runnable {
    public MyThread(String name, int time){
    }
    public MyThread() {
        // TODO Auto-generated constructor stub
    }
    private int ticket=1000;
    private boolean flag=true;
    public void run() {
        while(flag) {
            try {
                Thread.sleep(1);
            }catch(Exception e) {
                e.printStackTrace();
            }
            test();
        }
    }
    public synchronized void test() {
        if(ticket<=0){
            flag=false;
            return;
        }
        try{
            Thread.sleep(1);
        }catch(InterruptedException e){
            e.printStackTrace();            
        }
        System.out.println(Thread.currentThread().getName() + "正在卖出第" + (1001-ticket) + "张车票,剩余"+(ticket-1)+"张票");
        --ticket;
    }
}
        

 

package 实验七;

public class Text{
    public static void main(String[] args) {
        MyThread mt=new MyThread();
        Thread t1=new Thread(mt,"卖票窗口1");
        Thread t2=new Thread(mt,"卖票窗口2");
        Thread t3=new Thread(mt,"卖票窗口3");
        Thread t4=new Thread(mt,"卖票窗口4");
        Thread t5=new Thread(mt,"卖票窗口5");
        Thread t6=new Thread(mt,"卖票窗口6");
        Thread t7=new Thread(mt,"卖票窗口7");
        Thread t8=new Thread(mt,"卖票窗口8");
        Thread t9=new Thread(mt,"卖票窗口9");
        Thread t10=new Thread(mt,"卖票窗口10");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
        t6.start();
        t7.start();
        t8.start();
        t9.start();
        t10.start();
    }
}

 

实验结果:

错误截图:

 

 

 

 

正确截图:

 

 

实验总结:这次作业老师上课讲过,书上也有例子,所以做起来是比较容易的,但是难免会出现一点问题,像我的就没一次性实现需求,主要部分大致和书上的一样,但是就是没出现随机多窗口售票,顶多就一两个窗口在卖票,和谢思敏遇到的问题差不多吧。问了下他,在run方法里面多加了一个延迟,然后创建了一个新的test方法来控制判断售票情况,得到的结果就满足题目需求了。

学习总结:

实现多线程:

 通过继承class Thread或实现Runnable接口,我们可以实现多线程。

1. 通过继承class Thread实现多线程,class Thread中有两个最重要的函数run()和start()。run()函数必须进行覆写,把要在多个线程中并行处理的代码放到这个函数中。我们不能直接调用run()函数,而是通过调用start()函数来调用run()函数。

2.如果有一个类,它已继承了某个类,又想实现多线程,那就可以通过实现Runnable接口来实现。

Runnable接口只有一个run()函数。

把一个实现了Runnable接口的对象作为参数产生一个Thread对象,再调用Thread对象的start()函数就可执行并行操作。

 2. 通过synchronized实现资源同步

synchronized 关键字可以在整个class下进行锁定,避免static数据的同时访问。

 

JAVA IO

目前我们学习的是File类,使用File类可以进行创建或删除文件等常用操作。

注意:在使用该类时,必须向该类的构造方法中传递一个文件路径。

不同操作系统的路径分隔符也是不同的,windows的是“\”,Linux的是“/”。

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

 File类中的主要方法和常量

 

posted @ 2019-10-23 21:10  阳光盐巴  阅读(188)  评论(0编辑  收藏  举报